1

ViewPager には 3 つのタブ/フラグメントが含まれている TabLayout があります。

再開するたびに、各フラグメントにアクションを追加する必要があります。タッチを使用してフラグメントを変更するとすべてが正常に機能しますが、プログラムでタブを変更するとアプリがクラッシュします。この問題を防ぐにはどうすればよいですか?

私の問題について詳しく説明するコードを次に示します。

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
4

1 に答える 1

0

あなたの SwipeRefreshLayout が onFragment1の場合、なぜあなたはやっているのですか:

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

???

アクティビティのビュー階層からビューを見つけようとしています。Activity は Fragment プレースホルダーとして機能しますが、後者のビュー階層は含まれません。swipeRefreshLayout参照を取得してFragment1、そのロジックも処理する必要があります。

于 2016-01-05T17:19:12.427 に答える