1

2 つのタブを実装し、ナビゲーション ドロワーも実装しようとしています。両方を別々に行うことはできますが、2 つを組み合わせようとすると問題が発生します。私は元々、2 つのタブとナビゲーション ドロワーを MainActivity 内に作成するためのコードを持っていましたが、これは当時フラグメント アクティビティでしたが、ナビゲーション ドロワーにホーム オプションを設定することが明らかになったとき、コードをリファクタリングすることにしました。タブをタブ付きのフラグメントに変換し、その後、以前のように 2 つのフラグメントで埋めます。

起動時には問題ないように見えますが、ナビゲーション ドロワーのホーム オプションをクリックすると、各タブのフラグメントが取り除かれ、オプションをクリックするたびにさらに 2 つのタブが追加されます。

private void selectItem(int position) {
        Fragment fragment = new NullFragment();
        switch (position){
            case 0:
                fragment = new HomeFragment();
                break;
            case 1:
                         //Placeholder
                fragment = new PlanetFragment();

        }
        // update the main content by replacing fragments
        if (fragment != null) {
            FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();

            // update selected item and title, then close the drawer
            drawerListView.setItemChecked(position, true);
            setTitle(drawerItemTitles[position]);
            drawerLayout.closeDrawer(drawerListView);
        } else {
            // error in creating fragment
            Log.e("MainActivity", "Error in creating fragment");
        }
    }

HomeFragment.java

public class HomeFragment extends Fragment implements ActionBar.TabListener {

    AppSectionsPagerAdapter appSectionsPagerAdapter;
    ViewPager viewPager;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View rootView = null;
        /*if(savedInstanceState == null){*/
        rootView = inflater.inflate(R.layout.activity_home, container, false);
        appSectionsPagerAdapter = new AppSectionsPagerAdapter(getFragmentManager());
        final ActionBar actionBar = getActivity().getActionBar();

        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);


        viewPager = (ViewPager) rootView.findViewById(R.id.pager);
        viewPager.setAdapter(appSectionsPagerAdapter);
        viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                actionBar.setSelectedNavigationItem(position);
            }
        });

            actionBar.addTab(
                    actionBar.newTab()
                            .setIcon(R.drawable.ic_sync_to_cloud)
                            .setTabListener(this));

            actionBar.addTab(
                    actionBar.newTab()
                            .setIcon(R.drawable.ic_send_to_device)
                            .setTabListener(this));


            actionBar.setDisplayShowHomeEnabled(false);
            actionBar.setDisplayShowTitleEnabled(false);

        return rootView;
    }

    @Override
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    }

    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
        // When the given tab is selected, switch to the corresponding page in the ViewPager.
        viewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    }
}

これは、毎回 HomeFragment の新しいインスタンスが作成され、そのレイアウトにあるのは ViewPager だけだからだと思います。これを行う方法はありますか?新しいインスタンスは作成されませんが、代わりにフラグメントを保存および復元できます。さらにコードが必要な場合はお知らせください。

4

1 に答える 1

5

私は同様のことをしています: 私はナビゲーション ドロワーを持っており、ドロワー アイテムの 1 つはタブ付きの ViewPager です。ViewPager タブを初めて開いたときはすべて正常に機能しましたが、他のタブの 1 つに移動した後にそのタブに戻ると、それは空で、2 倍の数のタブがありました (別のアクティビティに移動して戻るのは問題ありませんでした)。

ここには 2 つの問題があります。1 つは、onCreate が再度実行され、タブが再度追加され、結果としてタブが重複することです。これは、追加する前に存在を確認するか、破棄時にすべてのタブを削除することで、比較的簡単に修正できます。他のアクティビティ/フラグメントが他のタブを使用する場合に備えて、このメソッドを追加しました (actionBar 変数をメソッド変数ではなくクラス変数として追跡する必要もあります)。

@Override
public void onDestroy() {
    actionBar.removeAllTabs();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
    super.onDestroy();
}

空のタブは、さまざまなフラグメント マネージャーが正しいフラグメントを見つけられないことが原因のようです。getSupportFragmentManager/getFragmentManager と getChildFragmentManager の使用の違いを確認してください ( getSupportFragmentManager() と getChildFragmentManager() の違いは何ですか? )。

修正は、ページャー フラグメントで自分の PagerAdapter (AppSectionsPagerAdapter) を初期化するときに、getFragmentManager の代わりに getChildFragmentManager を使用することでした。

appSectionsPagerAdapter = new AppSectionsPagerAdapter(getFragmentManager());

になる

appSectionsPagerAdapter = new AppSectionsPagerAdapter(getChildFragmentManager());
于 2014-03-26T13:04:33.387 に答える