@Satoh_D no blog

大分にUターンしたので記念に。調べたこととか作ったこととか食べたこととか

getFragmentManager() と getSupportedFragmentManager() の使いどころ

Androidのアプリをつくる必要があり、「はじめてのAndroidプログラミング」を読み進めてます。
その中で書籍のとおりに写経したのにエラーが出てハマったのでメモ。

利用環境

エラー箇所

P.106 ボタンタップ時にアラートを出す部分

// 前提条件
// Target Android DeviceのMinimum SDK: API15(Android 4.0.3 IcecreamSandwich)
// MainDialogFragment は既に定義済
// DialogFragment を利用するため、 android.support.v4.app.DialogFragment を 自動import済

public void onSaveButtonTapped(View view) {
    DialogFlagment newFragment = new MainDialogFragment();
    newFragment.show(getFragmentManager(), "MainFragmentDialog");
}

この時、

Cannot resolve method 'show(android.app.FragmentManager, java.lang.String)'

という風にAndroid Studioでエラーが出てしまい、コンパイルに失敗してしまう。
スペルミスではないし、誤植情報にも載っておらず...

調べてみると、Stackoverflowの記事とQiitaの記事にたどり着いた

When you are using android.support.v4.app.FragmentManager then you should use getSupportFragmentManager() and if you are using android.app.FragmentManager then use getFragmentManager().

対応したいAPIレベルが16より低い場合はsupport-packageを使用します。

今回作成しているアプリのサポート下限は API15(Android 4.0.3 IcecreamSandwich)のため、
android.support.v4.app.FlagmentManagerが importされており、その上でgetFragmentManagerを使用したためにエラーが出ていたのですね。
これで原因がわかりました。

冒頭でエラーが出た部分のソースコード

newFlagment.show(getSupportFragmentManager(), "MainFragmentDialog");

に変更したところ、無事にコンパイルが通ってシミュレータ上でアプリが動きました。
自動importとはいえ、どのライブラリがimportされたのかをちゃんと確認しておかないと思わぬところでハマりますね。