20

ビューページャーを使用して、複数のページにテキストを表示しています。新しいページを選択して現在のビューを取得しようとしています。現在のビューを取得したい理由は、ページ番号に基づいて、textview、image などのいくつかのビュー コンポーネントのいくつかのプロパティを変更しているためです。同じために以下のコードを使用しています。

ViewPager mPager = (ViewPager) findViewById(R.id.pager);
mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
mPager.setAdapter(mPagerAdapter);
View CurrView;
OnPageChangeListener pageChangelistener = new OnPageChangeListener() {
  @Override
       public void onPageSelected(int pageSelected) {
          currView = mPager.getChildAt(mPager.getCurrentItem());
      myTextView = (TextView)currView.findViewById(R.id.myTextView);
              loadBookmarkSetting(pageSelected);//do some changes in myTextView    properties based on the page number  }
 mPager.setOnPageChangeListener(pageChangelistener);

今、私が直面している問題は、3 ページスクロールした後、4 ページ目に到達すると、「myTextView = (TextView)currView.findViewById(R.id.myTextView);」という行で nullpointer 例外が発生することです。これは、currView が null であるためです。ここで何か間違ったことをしている場合のアイデア。現在のページ番号に基づいてビューを変更できるように、ビューページャーで現在のビュー(ページ)をキャプチャする他の方法はありますか?

4

5 に答える 5

66

instanceiateItem メソッド (PagerAdapter) で返すビューで setTag を使用できます。

したがって、PagerAdapter でビューをインスタンス化する場合、メソッドもinstantiateItem(ViewGroup container, int position))であり、ビューに setTag を使用する必要があります。

このような:

view.setTag("myview" + position);
return view;

現在のビューが必要な場合:

View view = (View) pager.findViewWithTag("myview" + pager.getCurrentItem());
于 2013-11-25T07:24:35.610 に答える
4

このアプローチを使用します。

@Nullable
    public static View getActiveView(@Nonnull final ViewPager viewPager) {
        final PagerAdapter adapter = viewPager.getAdapter();
        if (null == adapter || adapter.getCount() == 0 || viewPager.getChildCount() == 0) {
            return null;
        }

        int position;
        final int currentPosition = viewPager.getCurrentItem();

        for (int i = 0; i < viewPager.getChildCount(); i++) {
            final View child = viewPager.getChildAt(i);
            final LayoutParams layoutParams = (LayoutParams) child.getLayoutParams();
            if (layoutParams.isDecor) {
                continue;
            }
            final Field positionField;
            try {
                positionField = LayoutParams.class.getDeclaredField("position");
                positionField.setAccessible(true);
                position = positionField.getInt(layoutParams);
            } catch (NoSuchFieldException e) {
                break;
            } catch (IllegalAccessException e) {
                break;
            }
            if (position == currentPosition) {
                return child;
            }
        }
        return null;
    }
于 2015-09-21T16:26:33.537 に答える