151

アプリで ViewPager を使用しており、メインのアクティビティで定義しています。メソッド内onCreateで、SharedPreferences からいくつかのページを読み込み、それを PagerAdapter に渡します。

@Override
public int getCount() {
    return numberOfPages;
}

問題は、環境設定 (または別のアクティビティ) でこの番号を以前に表示したページ インデックスよりも小さい値に変更すると、この ViewPager を使用してアクティビティに戻ると、このインデックスが範囲外であるため、アプリがクラッシュすることです。アクティブな ViewPager のページを変更するだけで修正できます。それを行う方法はありますか?

4

5 に答える 5

397

質問を完全に理解しているかどうかはわかりませんが、質問のタイトルから、探しているのはpager.setCurrentItem( num ). これにより、プログラムで 内の別のページに切り替えることができますViewPager

これが問題でない場合、より具体的にするには、logcat からのスタック トレースを確認する必要があります。

于 2011-09-16T14:40:44.157 に答える
26

右にスライド

viewPager.arrowScroll(View.FOCUS_RIGHT);

左にスライド

viewPager.arrowScroll(View.FOCUS_LEFT);

于 2017-03-06T02:26:18.973 に答える
19

コードをチェックせずに、あなたが説明しているのは、ページが同期されておらず、古いデータがあるということだと思います.

ページ数を変更していると言いますが、古いページセットにアクセスしているためクラッシュします。これは、データを変更した後に電話していないように思えpageAdapter.notifyDataSetChanged()ます。

viewPager10 ページのセットの 3 ページを表示しているときに、 5 ページのみのセットに変更して を呼び出すnotifyDataSetChanged()と、新しいセットの 3 ページが表示されていることがわかります。以前に古いセットの 8 ページを表示していた場合、新しいセットを挿入して呼び出すとnotifyDataSetChanged()、クラッシュすることなく新しいセットの最後のページを表示していることがわかります。

現在のページを変更するだけでは、問題を隠しているだけかもしれません。

于 2014-01-26T23:15:47.537 に答える
18

別のページに切り替えるには、次のコードを試してください。

viewPager.postDelayed(new Runnable()
{
    @Override
    public void run()
    {
        viewPager.setCurrentItem(num, true);
    }
}, 100);
于 2016-09-15T21:05:55.110 に答える
3

補足回答

私は元々 、変数を宣言する必要がある匿名の内部クラスを作成したViewPagerため、他のクラス メソッドからへの参照を取得するのに問題がありました。解決策は、クラス メンバー変数を使用し、匿名内部クラスを使用しないことでした。addOnTabSelectedListenerViewPagerfinal

public class MainActivity extends AppCompatActivity {

    TabLayout tabLayout;
    ViewPager viewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        tabLayout = (TabLayout) findViewById(R.id.tab_layout);
        tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
        tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));
        tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));
        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

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

        // don't use an anonymous inner class here
        tabLayout.addOnTabSelectedListener(tabListener);

    }

    TabLayout.OnTabSelectedListener tabListener = new TabLayout.OnTabSelectedListener() {

        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

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

        }

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

        }
    };

    // The view pager can now be accessed here, too.
    public void someMethod() {
        viewPager.setCurrentItem(0);
    }

}
于 2016-12-05T05:16:45.780 に答える