3

問題は以下に強調表示されています。最初の部分では、これまでのところ何が機能しているかを説明しています。

1 つのアクティビティで複数のフラグメントを使用します。図の上部は、ランダムなコンテンツを含むリストなど、単一のフラグメントを示しています。どこかをクリックすると、 が開きますAboutTheAppFragment。クリックbackするとまた表示ASingleFragmentされます。これは完全に機能しますが、それは簡単な部分でした:)

忙しい猫

これは、新しいフラグメントを開くために使用したコードの抜粋です。

AboutTheAppFragment aboutTheAppFragment = new AboutTheAppFragment();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(mContainer.getId(), aboutTheAppFragment, AboutTheAppFragment.class.getName());
fragmentTransaction.addToBackStack(null);

ここに私の問題があります

代わりに、TabHost と ViewPager を使用してフラグメントを表示する をASingleFragment表示するのが好きTabHostPagerFragmentです (下の図を参照)。と の 2 つのフラグメントがあるTabOneFragmentTabTwoFragmentしますが、ViewPager には 1 つしか表示されません。これもうまく機能します。画面上をスライドするだけで、2 つのタブ フラグメントを切り替えることができます。ただし、どこかをクリックして を開き、もう一度AboutTheAppFragmentクリックbackすると、両方とも断片化され、何も表示さTabOneFragmentTabTwoFragmentません。デバイスを回転させると、フラグメントが再度リロード/復元され、すべて正常に動作します。だから私の質問は、ボタンをクリックしたときにそれらが正しく表示されるように、バックスタックに追加するTabOneFragmentにはどうすればよいですか? として設定すると、シナリオ1のように機能することに注意してくださいTabTwoFragmentbackTabOneFragmentASingleFragment、次にどこかをクリックして、もう一度クリックします。しかし、TabHostPagerFragment を使用すると機能しません。

忙しい猫

TabHostPagerFragment のコード スニペットを次に示します。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // Inflate the tabs pager fragment in the container
    View view = inflater.inflate(R.layout.fragment_tabs_pager, container, false);
    mContainer = container;

    // Set up the TabHost
    mTabHost = (TabHost) view.findViewById(android.R.id.tabhost);
    mTabHost.setup();

    // Set up the ViewPager
    mViewPager = (ViewPager) view.findViewById(R.id.pager);

    return view;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    // Now initialize the TabsAdapter which will be used to manage the tabs
    mTabsAdapter = new TabsAdapter(activity, mTabHost, mViewPager);

    // Finally add the tabs to the TabsAdapter: meal plan for today and meal plan for the week 
    mTabsAdapter.addTab(mTabHost.newTabSpec("TabOne").setIndicator("TabOne", TabOneFragment.class, null);
    mTabsAdapter.addTab(mTabHost.newTabSpec("TabTwo").setIndicator("TabTwo", TabTwoFragment.class, null);

    if (savedInstanceState != null) {
        // NEVER REACHES THIS CASE
        mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));
    }
}

savedInstanceState が常に null であることに気付きました。これを修正して、保存されたインスタンスの状態でタブを保存する方法はありますか?

助けていただければ幸いです。

敬具、マイケル

編集 :

フラグメントの呼び出し階層は次のとおりです。

09-25 09:19:25.695: V/TabsPagerParentFragment(1820): onPause
09-25 09:19:25.695: V/TabsPagerParentFragment(1820): onStop
09-25 09:19:25.703: V/TabsPagerParentFragment(1820): onDestroyView
09-25 09:19:25.710: V/AboutTheAppFragment(1820): onAttach
09-25 09:19:25.710: V/AboutTheAppFragment(1820): onCreate: savedInstanceState == null
09-25 09:19:25.710: V/AboutTheAppFragment(1820): onCreateView: savedInstanceState == null
09-25 09:19:25.812: V/AboutTheAppFragment(1820): onViewCreated
09-25 09:19:25.812: V/AboutTheAppFragment(1820): onActivityCreated
09-25 09:19:25.812: V/AboutTheAppFragment(1820): onViewStateRestored
09-25 09:19:25.812: V/AboutTheAppFragment(1820): onStart
09-25 09:19:25.812: V/AboutTheAppFragment(1820): onResume
09-25 09:19:27.304: V/AboutTheAppFragment(1820): onPause
09-25 09:19:27.304: V/AboutTheAppFragment(1820): onStop
09-25 09:19:27.304: V/AboutTheAppFragment(1820): onDestroyView
09-25 09:19:27.304: V/AboutTheAppFragment(1820): onDestroy
09-25 09:19:27.312: V/TabsPagerParentFragment(1820): onCreateView: savedInstanceState == null
09-25 09:19:27.320: V/TabsPagerParentFragment(1820): onViewCreated
09-25 09:19:27.320: V/TabsPagerParentFragment(1820): onActivityCreated
09-25 09:19:27.328: V/TabsPagerParentFragment(1820): onViewStateRestored
09-25 09:19:27.328: V/TabsPagerParentFragment(1820): onStart
09-25 09:19:27.328: V/TabsPagerParentFragment(1820): onResume
4

2 に答える 2

0

フラグメントに 3 つのタブを含む複雑なレイアウトがあり、他のフラグメントに切り替えられます。ViewpagerAdapterホームボタンを押しても状態が保持されることに気付きました。私の問題は、前後に切り替えると、子フラグメント UI ビュー要素が無効になり、クラッシュすることでした。鍵はnewあなたのViewPagerAdapter. アダプターのヌルチェックを追加するとうまくいきました。setOffscreenPageLimit()また、必ずニーズに合わせて割り当ててください。また、私が理解していることから、setRetainInstance(true);UI を持つフラグメントには使用しないでください。ヘッドレス フラグメント用に設計されています。

タブを保持するフラグメントで:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_tab, container, false);
    tabLayout = (TabLayout) view.findViewById(R.id.tablayout);
    viewPager = (ViewPager) view.findViewById(R.id.viewPager);

    //Important!!! Do not fire the existing adapter!!
    if (viewPagerAdapter == null) {
        viewPagerAdapter = new ViewPagerAdapter(getChildFragmentManager());
        viewPagerAdapter.addFragments(new AFragment(), "A");
        viewPagerAdapter.addFragments(new BFragment(), "B");
        viewPagerAdapter.addFragments(new CFragment(), "C");
    }
    //Allocate retention buffers for three tabs, mandatory
    viewPager.setOffscreenPageLimit(3);
    tabLayout.setupWithViewPager(viewPager);
    viewPager.setAdapter(viewPagerAdapter);

    return view;
}
于 2017-05-10T13:13:45.767 に答える