Android TabLayout больше не отображает содержимое при переключении фрагмента

Я использую навигационный ящик в своем проекте с 5 фрагментами. В одном фрагменте у меня в библиотеке поддержки дизайна введен TabLayout, который включает в себя 2 фрагмента. Все работает нормально, за исключением случаев, когда я оставляю фрагмент с TabLayout и переключаюсь обратно на него, все содержимое исчезает.

В каждом фрагменте TabLayout у меня есть SwipeRefreshLayout с ListView, они оба ничего не отображают при переключении.

Я также заметил, что TabLayout начинает вести себя странно. под странным я подразумеваю, что белый индикатор начинает прыгать, вы можете удерживать его в середине двух вкладок...

Значит, я что-то упускаю из-за того, что 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 работает нормально. Когда я переключаюсь на другой фрагмент с помощью навигационного ящика и снова переключаюсь на этот фрагмент, он ничего не отображает, как описано выше.

РЕДАКТИРОВАТЬ: Я единственный, у кого есть проблемы с этим? Если у кого были проблемы, как решали?


person qwertz    schedule 01.07.2015    source источник


Ответы (1)


Когда я использовал viewPager и обратно, у меня были пустые фрагменты до переключения, когда я использовал getSupportFragmentManager.

Попробуйте использовать: getChildFragmentManager.

person mtrakal    schedule 21.07.2015
comment
Да, мне это помогло, getSupportFragmentManager не работал, но getChildFragmentManager работает отлично. - person Pratik Saluja; 08.11.2016
comment
Это потому, что ViewPager находится внутри фрагмента, и вам нужен собственный FragmentManager для каждого вложенного фрагмента для обработки внутренних фрагментов. stackoverflow.com/a/15350500/4024146 - person mtrakal; 07.05.2017