10

プロジェクトでナビゲーション ドロワーを使用しており、5 つのフラグメントが含まれています。1 つのフラグメントでは、デザイン サポート ライブラリに導入された TabLayout があり、これには 2 つのフラグメントが含まれています。TabLayout を持つフラグメントを離れてそれに戻ると、すべてのコンテンツが失われることを除いて、すべて正常に動作します。

TabLayout の各フラグメントには、ListView を含む SwipeRefreshLayout があり、どちらも切り替え時に何も表示されません。

また、TabLayout の動作がおかしくなることにも気付きました。奇妙なことに、白いインジケーターがジャンプし始め、2 つのタブの真ん中で静止したままにしておくことができます...

TabLayout がとても奇妙に振る舞う何かが欠けているのでしょうか?

ここのコード: TabLayout を含むフラグメント:

public class MainFragment extends Fragment {
    private static String locale;
    private static ViewPager viewPager;
    private static TabLayout tabLayout;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Utils.changeLanguage(getActivity());

        final Context contextThemeWrapper = new ContextThemeWrapper(getActivity(), R.style.MyStyle);

        LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper);

        View view = localInflater.inflate(R.layout.fragment1, container, false);

        viewPager = (ViewPager) view.findViewById(R.id.viewpager);
        tabLayout = (TabLayout) view.findViewById(R.id.tabs);

        return view;
    }

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

        setupViewPager(viewPager);
        tabLayout.setupWithViewPager(viewPager);
    }

    private void setupViewPager(ViewPager viewPager) {
        LinesTabsAdapter adapter = new LinesTabsAdapter(getActivity().getSupportFragmentManager());
        adapter.addFragment(new Fragment1(), "Fragment 1");
        adapter.addFragment(new Fragment2(), "Fragment2");
        viewPager.setAdapter(adapter);
    }


    public static class Fragment extends Fragment {
        private static List<RowItems1> rowItems;
        private static ListView listview;
        private static Adapter1 adapter;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

            View view = inflater.inflate(R.layout.activity1, container, false);

            listview = (ListView) view.findViewById(R.id.listview1);

            return view;
        }

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

            updateInfo(true);
        }

        public static void updateInfo() {
            rowItems = new ArrayList<>();
            adapter = new Adapter1(context, rowItems);
           listview.setAdapter(adapter);
        }
    }

    public static class Fragment2 extends Fragment {
        private static List<RowItems2> rowItems;
        private static ListView listview;
        private static Adapter1 adapter;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

            View view = inflater.inflate(R.layout.activity_lines_all, container, false);

            listview = (ListView) view.findViewById(R.id.activity2);

            return view;
        }

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

            updateInfo(true);
        }

        public static void updateInfo() {
            rowItems = new ArrayList<>();
            adapter = new Adapter2(context, rowItems);
            listview.setAdapter(adapter);
        }
    }
}

MainFragment をシングルトンとして使用し、ユーザーがナビゲーション ドロワーで選択するとすぐにコンテンツを置き換えています。それに切り替えると、すべて正常に動作し、ListView にはそのデータが含まれ、SwipeRefreshLayout は正常に動作します。ナビゲーション ドロワーを使用して別のフラグメントに切り替え、このフラグメントに戻ると、上記のように何も表示されません。

編集:これに問題があるのは私だけですか?誰かが問題を抱えていた場合、どのように修正しましたか?

4

1 に答える 1

24

viewPager を使用して元に戻すと、 を使用したときに switch まで空のフラグメントがありましたgetSupportFragmentManager

使用してみてください: getChildFragmentManager.

于 2015-07-21T10:52:01.967 に答える