アプリでViewPagerを使用し、メインアクティビティで定義します。 onCreate
メソッド内でSharedPreferencesからいくつかのページをロードし、PagerAdapterに渡します。
@Override
public int getCount() {
return numberOfPages;
}
問題は、環境設定(または別のアクティビティ)でこの数値を前に表示したページインデックスよりも小さい値に変更すると、このViewPagerでアクティビティに戻るときにこのインデックスが範囲外になるため、アプリがクラッシュすることです。アクティブなViewPagerのページを変更するだけで修正できます。それを行う方法はありますか?
質問を完全に理解しているかどうかはわかりませんが、質問のタイトルから、あなたが探しているのはpager.setCurrentItem( num )
であると推測しています。これにより、ViewPager
内の別のページにプログラムで切り替えることができます。
これが問題でない場合、より具体的にするために、logcatからスタックトレースを見る必要があります。
右にスライド
viewPager.arrowScroll(View.FOCUS_RIGHT);
左にスライド
viewPager.arrowScroll(View.FOCUS_LEFT);
コードをチェックせずに、あなたが説明しているのは、ページが同期しておらず、古いデータがあるということです。
古いページセットにアクセスしているため、ページ数を変更してからクラッシュすると言います。これは、データを変更した後にpageAdapter.notifyDataSetChanged()
を呼び出していないように思えます。
viewPager
が10ページのセットの3ページ目を表示していて、5ページのみのセットに変更したら、notifyDataSetChanged()
を呼び出すと、3ページ目が表示されます。新しいセット。以前に古いセットのページ8を表示していた場合、新しいセットを挿入してnotifyDataSetChanged()
を呼び出した後、クラッシュせずに新しいセットの最後のページを表示していることがわかります。
現在のページを単に変更する場合、問題を隠しているだけかもしれません。
別のページに切り替えるには、次のコードを試してください。
viewPager.postDelayed(new Runnable()
{
@Override
public void run()
{
viewPager.setCurrentItem(num, true);
}
}, 100);
補足回答
ViewPager
が匿名の内部クラスを作成し、そのためにaddOnTabSelectedListener
変数をViewPager
として宣言する必要があるため、元々他のクラスメソッドからfinal
への参照を取得するのに問題がありました。解決策は、クラスメンバー変数を使用し、匿名の内部クラスを使用しないことでした。
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);
}
}