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

※この記事は以前Qiitaに投稿されていた古い記事です

はじめに

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) {
    // 処理
}

おわりに

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



コメント

人気の投稿

【Linux】Linuxでディレクトリ毎にzip圧縮する

[Qiita] Google Playのクローズドベータ版テストでメールアドレスを指定して公開する

[Qiita] Androidの実機でPCのlocalhostに接続したり、Webページの要素を検証する