getFragmentManager() と getSupportedFragmentManager() の使いどころ
Androidのアプリをつくる必要があり、「はじめてのAndroidプログラミング」を読み進めてます。
その中で書籍のとおりに写経したのにエラーが出てハマったのでメモ。
利用環境
- OS: Windows8.1
- Android Studio: 2.1.2
エラー箇所
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 usegetSupportFragmentManager()
and if you are usingandroid.app.FragmentManager
then usegetFragmentManager()
.
対応したいAPIレベルが16より低い場合はsupport-packageを使用します。
今回作成しているアプリのサポート下限は API15(Android 4.0.3 IcecreamSandwich)のため、
android.support.v4.app.FlagmentManager
が importされており、その上でgetFragmentManager
を使用したためにエラーが出ていたのですね。
これで原因がわかりました。
冒頭でエラーが出た部分のソースコードを
newFlagment.show(getSupportFragmentManager(), "MainFragmentDialog");
に変更したところ、無事にコンパイルが通ってシミュレータ上でアプリが動きました。
自動importとはいえ、どのライブラリがimportされたのかをちゃんと確認しておかないと思わぬところでハマりますね。