Edited at

FragmentのonAttach(Context context)が呼ばれない

More than 3 years have passed since last update.


はじめに

FragmentのonAttach(Context context)メソッドを使うときに、少しハマったのでメモ。


onAttach(Activity activity)とonAttach(Context context)

API Level 23より前では、onAttach(Activity activity)を使っていたのですが、このメソッドはAPI Level 23で非推奨になりました。

これの代わりにonAttach(Context context)というメソッドが登場したので、API Level 23以上ではこれを使うことになります。


Support LibraryのFragmentの場合

android.support.v4.app.Fragmentを継承しているFragmentの場合、onAttach(Context context)が実装されているので、以下のようにOverrideしても問題無く呼ばれます。

@Override

public void onAttach(Context context) {
super.onAttach(context);
}


普通のFragmentの場合

Support LibraryのFragmentで普通に使えていたので、同じようにandroid.preference.PreferenceFragmentでonAttach(Context context)をOverrideしたら、Android 6.0未満の端末では残念ながら呼ばれませんでした。

onAttach(Context context)はAPI Level 23で新しく実装されたメソッドなので当然ですね。

PreferenceFragmentがSupport LibraryのFragmentを継承しているものではないことを忘れていたので、少し悩んでしまいました。

結論、普通のFragmentの場合は

Android 6.0以上だと、どっちも呼ばれますが、


  • onAttach(Context context)

  • onAttach(Activity activity)

Android 6.0未満だと以前のonAttachしか呼ばれませんでした。


  • onAttach(Activity activity)

なので、こんな感じで実装しておきました。

@Override

public void onAttach(Context context) {
super.onAttach(context);
onAttachContext(context);
}

@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) return;
onAttachContext(activity);
}

private void onAttachContext(Context context) {
// 処理
}


おわりに

なにか間違ったところがあればご指摘していただけると助かります。

以上です。