ViewPager 페이지를 변경하는 방법? 에서이 숫자를 이전에

내 앱에서 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()데이터를 변경 한 후 .

귀하의 경우에는 viewPager10 페이지 세트의 3 페이지를 보여주고있다, 당신은 다음 전화 만 5 세트로 변경 notifyDataSetChanged(), 당신이 찾을 수 있습니다하면 이제 새로운 세트의 3 페이지를보고있는 것입니다. 이전 세트의 8 페이지를 이전에보고 있었다면 새 세트를 넣고 전화 notifyDataSetChanged()를 한 후에 충돌없이 새 세트의 마지막 페이지를 볼 수 있습니다.

현재 페이지 만 변경하면 문제를 숨길 수 있습니다.


답변

다른 페이지로 전환하려면 다음 코드로 시도하십시오.

viewPager.postDelayed(new Runnable()
{
    @Override
    public void run()
    {
        viewPager.setCurrentItem(num, true);
    }
}, 100);


답변

보충 답변

익명의 내부 클래스를 만들었 ViewPager으므로 변수를 선언 addOnTabSelectedListener해야 했기 때문에 원래 다른 클래스 메서드에서 참조를 얻는 데 문제가있었습니다 . 해결책은 클래스 멤버 변수를 사용하고 익명의 내부 클래스를 사용하지 않는 것입니다.ViewPagerfinal

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);
    }

}


답변