Программно выбрать вкладку на вкладке, приложение вылетает из строя при попытке доступа к содержимому внутри выбранного фрагмента

У меня TabLayout с ViewPager включает 3 вкладки/фрагмента.

Мне нужно добавлять действия к каждому фрагменту каждый раз, когда он возобновляется. Все работает правильно при изменении фрагмента с помощью касания, но когда я программно меняю вкладку, приложение вылетает. Что мне делать, чтобы предотвратить эту проблему?

Вот код, поясняющий мою проблему.

private TabLayout tabLayout;

@Override
public void onResume() {
    super.onResume();

    //This part works when first tab is selected
    int chatSelTab = 0;
    TabLayout.Tab selectedTab = tabLayout.getTabAt(chatSelTab);
    selectedTab.select();
}



private void setupTablayout() {
    tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.persons)));
    tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.groups)));
    tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.online)));

    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

    final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
    final PagerAdapter adapter = new PagerAdapter
            (getSupportFragmentManager(), tabLayout.getTabCount(), this);
    viewPager.setAdapter(adapter);
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            Voids.savePreferences(getApplicationContext(), Voids.CHAT_SELECTED_TAB, tab.getPosition());
            viewPager.setCurrentItem(tab.getPosition());
            switch (tab.getPosition()) {
                case 1:

                    /* TODO: app crashes here when programmatically select tab nro 1. */

                    SwipeRefreshLayout swipeRefreshLayout = (SwipeRefreshLayout) activity.findViewById(R.id.swipeRefresh);
                    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
                        @Override
                        public void onRefresh() {
                            // DO MY STUFF
                        }
    });
                    break;
            }
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
}

Вот что я получаю в logcat

08-25 01:20:45.054  31753-31753/com.myapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.myapp, PID: 31753
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.widget.SwipeRefreshLayout.setOnRefreshListener(android.support.v4.widget.SwipeRefreshLayout$OnRefreshListener)' on a null object reference

comment
Сбой вашего приложения, потому что ваш Swiperefresh является нулевой ссылкой. Это не вкладка 1. Не могли бы вы показать мне полный класс, пожалуйста?   -  person Erik Jhordan Rey    schedule 25.08.2015
comment
Как я уже сказал, он работает, если щелкнуть вкладку или провести пальцем по вкладке 1, но если я щелкну ее программно, произойдет сбой.   -  person EspeH    schedule 25.08.2015
comment
Конечно, но вы регистрируете кота, который говорит, что ссылка Swiperefresh Layout нулевая. Ваш случай 1 плохой! Где вы используете Swiperefresh? SwiperefreshLayout должен быть во фрагменте (раздел вкладки).   -  person Erik Jhordan Rey    schedule 25.08.2015
comment
Этот swiperefreshLayout находится под фрагментом 1, и он работает правильно, разница только в том, что я нажимаю его программно. Я понимаю, что он нулевой, но почему он нулевой при выборе из onResume, а не вручную.   -  person EspeH    schedule 25.08.2015
comment
Мне нужно увидеть больше кода вашего XML и вашего класса, где находится viewpager.   -  person Erik Jhordan Rey    schedule 25.08.2015


Ответы (1)


Если ваш SwipeRefreshLayout находится на Fragment1, то почему вы делаете:

SwipeRefreshLayout swipeRefreshLayout = (SwipeRefreshLayout) activity.findViewById(R.id.swipeRefresh);

???

Вы пытаетесь найти представление в иерархии представлений вашей деятельности. Несмотря на то, что действие работает как заполнитель фрагмента, иерархия представлений последнего не включена. Вам нужно получить ссылку swipeRefreshLayout из Fragment1 и также обработать логику на ней.

person Chisko    schedule 05.01.2016
comment
Это не дает ответа на вопрос. Чтобы подвергнуть критике или запросить разъяснения у автора, оставьте комментарий под его сообщением — вы всегда можете прокомментировать свои собственные сообщения, и как только у вас будет достаточно репутация, вы сможете комментировать любой пост. – Из обзора - person Alex Jolig; 06.01.2016
comment
Я не критикую, просто указываю на ошибку. Пожалуйста, прочитайте мой ответ еще раз - person Chisko; 06.01.2016