web-dev-qa-db-ja.com

getChildFragmentManager()をどこで呼び出すか?

問題

Googleのドキュメントによると:

フラグメントをフラグメント内に埋め込むことができるようになりました。これは、動的で再利用可能なUIコンポーネントをそれ自体が動的で再利用可能なUIコンポーネントに配置するさまざまな状況で役立ちます。たとえば、ViewPagerを使用して左右にスワイプし、画面スペースの大部分を消費するフラグメントを作成する場合、各フラグメントページにフラグメントを挿入できるようになりました。フラグメントをネストするには、フラグメントを追加するフラグメントでgetChildFragmentManager()を呼び出すだけです。これにより、フラグメントトランザクションを作成するためにトップレベルのアクティビティから通常行うように使用できるFragmentManagerが返されます。たとえば、既存のFragmentクラス内からフラグメントを追加するコードを次に示します。

_Fragment videoFragment = new VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment, videoFragment).commit();
_

だから私は(例えば)次のようなTestFragmentを持っていました:

_public class TestFragment extends Fragment {

    private View mFragmentView;
    private FrameLayout mFrameLayout;   

    public HistoryFragment() {
        super();
    }       

    @Override   
    public View onCreateView(LayoutInflater pInflater, ViewGroup pViewGroup, Bundle pBundle) {          

        mFragmentView = pInflater.inflate(R.layout.fragment_layout, pViewGroup, false);         

        mFrameLayout = (FrameLayout) mFragmentView.findViewById(R.id.framelayout);

        return mFragmentView;
    }   

    public void onDestroyView() {
        super.onDestroyView();
    }    

    /* ISSUE */
    public void doSomethingSpecial() {
        FragmentManager tFragmentManager = getChildFragmentManager();
    }
}
_

MainActivityで、フラグメントを次のように初期化します。

_mTestFragment = new TestFragment();
mTestFragment.doSomethingSpecial();
_

次に、フラグメントをViewPager経由でFragmentPagerAdapterに渡します。

最後に、例外が発生します。しかし、私が使用する場合:

_mTestFragment = new TestFragment();
_

その後、それは動作します。

質問

フラグメントのどこでgetChildFragmentManager()メソッドを呼び出す必要がありますか?私が間違っていることは何ですか?

新しいAndroidネストされたフラグメントを使用する良い例があれば、リンクを共有してください。ご協力いただければ幸いです。

11
AlexMomotov

簡単な答え:フラグメントのgetChildFragmentManager()メソッドでonViewCreated()を呼び出して使用します。

例えば:

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    addInnerFragment(); // This method does the getChildFragmentManager() stuff.
}
3

実は次の場合に使ってみました。

ViewPagerにマップを追加しようとしていました。ご存知かもしれませんが、ViewPagerの「ページ」はフラグメントであるため、このコードを使用できませんでした アクティビティのマップを使用したサンプル 。次のようなことを行って、アクティビティからSupportMapFragmentを取得しようとしました。

SupportMapFragment mapView = (SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.map);

しかし、mapViewは常にnullであったため、アプリケーションがクラッシュします。

私は次のことを見つけました answer そしてすぐに動作します。

これは、getChildFragmentManager()を使用する便利な例です。

これがお役に立てば幸いです。

1
Amaury Esparza

docs によると、この方法は次のとおりです。

このフラグメント内にフラグメントを配置および管理するためのプライベートFragmentManagerを返します。

したがって、既存のフラグメントに新しいフラグメントを追加/置換する場合に使用できます。最初にTestFragmentトランザクションをコミットしてから、内部フラグメントを追加する必要があります。次のようなものを試してください。

    TestFragment mTestFragment = new TestFragment();
//get the activity's fragment manager to add the fragment
    FragmentTransaction transaction= getFragmentManager().beginTransaction();
    transaction.add(R.id.container, mTestFragment).commit();
    //add the inner fragment
    mTestFragment.doSomethingSpecial();
0
Mina Samy