web-dev-qa-db-ja.com

FragmentTabHostからネストされたフラグメントへの参照を取得する

私のアプリケーションでは、1つのActivityFragmentを保持するFragmentTabHostを使用しているため、そのすべてのタブは_nested Fragments_です。

Activityとその_nested Fragment_を保持するFragment内で、onAttachedFragment()を使用して添付されたものへの参照を取得できます。

しかし、FragmentTabHostから_nested Fragment_への参照を取得する方法は?

18
Alex Bonel

さて、FragmentTabHostのソースコードを調べてみると、フラグメントタブを追加すると、ネストされたTabSpecFragmentのタグが割り当てられることがわかりました。

したがって、このFragmentへの参照を取得するには、

getChildFragmentManager().findFragmentByTag(tabSpecTag)

25
Alex Bonel

しばらくこれを試していましたが、追加した直後にonCreateView()でマネージャーにアクセスしようとしたため、nullからFragmentManagerが返されていました。

ここに何が起こったのかについての良い説明があります

まだ選択されていないFragmentタブはFragmentManagerにまだ存在しないため、nullも返されることに注意することも重要です。 FragmentFragmentManagerに到達する前に、mTabHost.setCurrentTab(index)を呼び出すことでこれを回避しました。あまりきれいではありませんが、機能します。

7
loadedion

遅延のあるコードの実行を伴わないため、少し良い解決策を見つけました(Androidハードウェアの断片化とさまざまなプロセッサ速度が与えられた場合は常に問題があります)。

OnTabChanged()メソッドで、フラグメントを検索する前に、tabHostに関連付けられているフラグメントマネージャーでexecutePendingTransactions()を呼び出します。 FragmentTabHostソースコードには、executePendingTransactions()を呼び出す必要がある場所がいくつかあるようですが、呼び出せません。

これは、1つの例外を除いてタブが変更されるたびに機能します...選択された最初のタブは引き続きnullに戻ります...私の特定のケースでは、onResumeにコードを挿入することで、この例外を別の方法で処理できました。

お役に立てれば。

1
Justin

上記の解決策も機能していますが、もう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でキャストする必要があります。

1
Nirav Shah