私のアプリケーションでは、1つのActivity
とFragment
を保持するFragmentTabHost
を使用しているため、そのすべてのタブは_nested Fragments
_です。
Activity
とその_nested Fragment
_を保持するFragment
内で、onAttachedFragment()
を使用して添付されたものへの参照を取得できます。
しかし、FragmentTabHost
から_nested Fragment
_への参照を取得する方法は?
さて、FragmentTabHost
のソースコードを調べてみると、フラグメントタブを追加すると、ネストされたTabSpec
にFragment
のタグが割り当てられることがわかりました。
したがって、このFragment
への参照を取得するには、
getChildFragmentManager().findFragmentByTag(tabSpecTag)
しばらくこれを試していましたが、追加した直後にonCreateView()
でマネージャーにアクセスしようとしたため、null
からFragmentManager
が返されていました。
まだ選択されていないFragment
タブはFragmentManager
にまだ存在しないため、null
も返されることに注意することも重要です。 Fragment
でFragmentManager
に到達する前に、mTabHost.setCurrentTab(index)
を呼び出すことでこれを回避しました。あまりきれいではありませんが、機能します。
遅延のあるコードの実行を伴わないため、少し良い解決策を見つけました(Androidハードウェアの断片化とさまざまなプロセッサ速度が与えられた場合は常に問題があります)。
OnTabChanged()メソッドで、フラグメントを検索する前に、tabHostに関連付けられているフラグメントマネージャーでexecutePendingTransactions()を呼び出します。 FragmentTabHostソースコードには、executePendingTransactions()を呼び出す必要がある場所がいくつかあるようですが、呼び出せません。
これは、1つの例外を除いてタブが変更されるたびに機能します...選択された最初のタブは引き続きnullに戻ります...私の特定のケースでは、onResumeにコードを挿入することで、この例外を別の方法で処理できました。
お役に立てれば。
上記の解決策も機能していますが、もう1つ簡単な解決策があります。
@Override
public void onTabChanged(final String tabId) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mFragment = getChildFragmentManager().findFragmentByTag("Tagname");
}
},1000);
}
ここでは、FragmentTabHost.onTabChangeListenerを実装する必要があります。childFragmentManagerからフラグメントをフェッチする際に2番目の遅延を保持しました。
注:使用したフラグメントをmFragmentでキャストする必要があります。