내 앱에서 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);
}
}