75

ViewPagerを持っていますが、位置ではなく、現在選択されている表示可能なビューを取得したいと思います。

  1. getChildAt(getCurrentItem)間違って戻るView
  2. これは常に機能するとは限りません。nullを返す場合もあれば、間違ったビューを返す場合もあります。

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
    
        if (isVisibleToUser == true) { 
            mFocusedListView = ListView; 
        }
    }
    
  3. PageListenerも機能ViewPagergetChildAt()ず、毎回正しいビューが表示されません。

現在表示されているビューを取得するにはどうすればよいですか?

View view = MyActivity.mViewPager.getChildAt(MyActivity.mViewPager.getCurrentItem()).getRootView();
ListView listview = (ListView) view.findViewById(R.id.ListViewItems);
4

17 に答える 17

135

私はそれを理解しました。私がしたことは、すべてのs / sにsetTag()名前を付けて呼び出し、タグとして単に呼び出すことでした。ViewListViewfindViewWithTag(mytag)mytag

残念ながら、これを解決する他の方法はありません。

于 2012-10-12T12:03:20.723 に答える
10

私はちょうど同じ問題に遭遇し、以下を使用してそれを解決しました:

View view = MyActivity.mViewPager.getFocusedChild();
于 2013-01-30T19:03:26.443 に答える
8

アダプターの呼び出しからitensのリストにアクセスすることで、現在の要素をmyAdapter.yourListItens.get(myViewPager.getCurrentItem()); 取得できます。ご覧のとおり、ViewPagerは、アダプターの要素の現在のインデックス(現在のページ)を取得できます。

FragmentPagerAdapterを使用している場合は、次のキャストを実行できます。

FragmentPagerAdapter adapter = (FragmentPagerAdapter)myViewPager.getAdapter();

と電話

adapter.getItem(myViewPager.getCurrentItem());

これは私にとって非常にうまくいきます;)

于 2013-07-17T15:39:10.547 に答える
8

私はこの方法をandroid.support.v4.view.ViewPager

View getCurrentView(ViewPager viewPager) {
        try {
            final int currentItem = viewPager.getCurrentItem();
            for (int i = 0; i < viewPager.getChildCount(); i++) {
                final View child = viewPager.getChildAt(i);
                final ViewPager.LayoutParams layoutParams = (ViewPager.LayoutParams) child.getLayoutParams();

                Field f = layoutParams.getClass().getDeclaredField("position"); //NoSuchFieldException
                f.setAccessible(true);
                int position = (Integer) f.get(layoutParams); //IllegalAccessException

                if (!layoutParams.isDecor && currentItem == position) {
                    return child;
                }
            }
        } catch (NoSuchFieldException e) {
            Log.e(TAG, e.toString());
        } catch (IllegalArgumentException e) {
            Log.e(TAG, e.toString());
        } catch (IllegalAccessException e) {
            Log.e(TAG, e.toString());
        }
        return null;
    }
于 2019-05-27T12:14:14.483 に答える
2

アンドロイドビューを飾る方法を見つける努力の間に、私はブログに文書化したOPの問題の代替ソリューションを定義したと思います。コードがここにすべてを含めるには少し多すぎるように思われるので、私はそれにリンクしています。

私が提案する解決策:

  • アダプターとビューを完全に分離します
  • ビューページャーから任意のインデックスを使用してビューを簡単に照会できnull、このビューが現在ロードされていない場合、または対応するビューが返されます。
于 2014-12-02T14:16:53.800 に答える
2

PagerAdapterを拡張するアダプタを使用し、PagerAdapter内のsetPrimaryItemメソッドをオーバーライドします。

https://developer.android.com/reference/android/support/v4/view/PagerAdapter.html

class yourPagerAdapter extends PagerAdapter
{
    // .......

    @Override
    public void setPrimaryItem (ViewGroup container, int position, Object object)
    {
        int currentItemOnScreenPosition = position;
        View onScreenView = getChildAt(position);
    }

    // .......

}
于 2018-02-15T12:35:16.713 に答える
1

setOffscreenPageLimit(N-1) ページ数が少なく、メモリを無駄にすることなくNがページの総数である場合に安全に適用できる場合は、次のようにすることができます。

public Object instantiateItem(final ViewGroup container, final int position) {      
    CustomHomeView RL = new CustomHomeView(context);
    if (position==0){
        container.setId(R.id.home_container);} ...rest of code

次に、ページにアクセスするためのコードを示します

((ViewGroup)pager.findViewById(R.id.home_container)).getChildAt(pager.getCurrentItem()).setBackgroundColor(Color.BLUE);

必要に応じて、ページにアクセスするためのメソッドを設定できます

RelativeLayout getPageAt(int index){
    RelativeLayout rl =  ((RelativeLayout)((ViewGroup)pager.findViewById(R.id.home_container)).getChildAt(index));
    return rl;
}
于 2014-02-02T16:47:16.603 に答える
1

これを試して

 final int position = mViewPager.getCurrentItem();
    Fragment fragment = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.rewards_viewpager + ":"
            + position);
于 2016-11-09T07:14:43.927 に答える
1

もっと一般的にやらなければならなかったので、ViewPager.LayoutParamsのプライベートな「位置」を使用することにしました。

        final int childCount = viewPager.getChildCount();
        for (int i = 0; i < childCount; i++) {
            final View child = viewPager.getChildAt(i);
            final ViewPager.LayoutParams lp = (ViewPager.LayoutParams) child.getLayoutParams();
            int position = 0;
            try {
                Field f = lp.getClass().getDeclaredField("position");
                f.setAccessible(true);
                position = f.getInt(lp); //IllegalAccessException
            } catch (NoSuchFieldException | IllegalAccessException ex) {ex.printStackTrace();}
            if (position == viewPager.getCurrentItem()) {
                viewToDraw = child;
            }
        }
于 2017-05-22T19:18:09.943 に答える
1

私はFabulousFilterのViewPagerUtilsを使用しています:

ViewPagerUtils.getCurrentView(ViewPager viewPager)
于 2018-07-18T10:02:48.740 に答える
1
viewpager.getChildAt(0)

これにより、現在選択されているビューが常に返されます。これは私のために働いた。

于 2020-02-16T07:26:32.160 に答える
0

それは画面上での最初のアクティビティですか、それともすでにいくつかを重ね合わせていますか?

これを試して:

findViewById(android.R.id.content).getRootView()

あるいは単に:

findViewById(android.R.id.content) 

また、あなたが試したいものに応じて:

((ViewGroup)findViewById(android.R.id.content)).getChildAt(0)
于 2012-10-12T08:11:26.180 に答える
0

システムタグでフラグメントを見つけることができます。それは私のために働いています。機能的に使用しましたOnMeasure

id--viewPager ID

position-取得したいフラグメント

重要!フラグメントがアダプタで作成された場合、このフラグメントを取得します。supportedFragmentManager.findFragmentByTag("android:switcher:" + id + ":" + position)したがって、 nullifyをチェックする必要があります

次のようなビューを取得できます。

supportedFragmentManager.findFragmentByTag("android:switcher:" + id + ":" + position).view

アダプターにカスタムタグを付けないでください

于 2018-07-29T21:45:36.050 に答える
0

ビューページャーリスナーで取得して、選択されたアイテムの位置を取得できます

viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener{
        override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
            
        }

        override fun onPageSelected(position: Int) {
            
        }

        override fun onPageScrollStateChanged(state: Int) {
            
        }

    })
于 2021-10-11T09:38:39.577 に答える
0

この方法を使用してください。

View getCurrentView(ViewPager viewPager) {
        try {
            final int currentItem = viewPager.getCurrentItem();
            for (int i = 0; i < viewPager.getChildCount(); i++) {
                final View child = viewPager.getChildAt(i);
                final ViewPager.LayoutParams layoutParams = (ViewPager.LayoutParams) child.getLayoutParams();

                Field f = layoutParams.getClass().getDeclaredField("position"); //NoSuchFieldException
                f.setAccessible(true);
                int position = (Integer) f.get(layoutParams); //IllegalAccessException

                if (!layoutParams.isDecor && currentItem == position) {
                    return child;
                }
            }
        } catch (NoSuchFieldException e) {
            Log.e(TAG, e.toString());
        } catch (IllegalArgumentException e) {
            Log.e(TAG, e.toString());
        } catch (IllegalAccessException e) {
            Log.e(TAG, e.toString());
        }
        return null;
    }

誰かがここで解決策のコメントを知っている場合、androidxではnullを返す可能性があります

于 2022-01-10T06:27:05.163 に答える
-3

こちらをご確認ください

((ViewGroup))mViewPager.getChildAt(MyActivity.mViewPager.getCurrentItem()));

それ以外の場合は、このリンクを確認してください。

于 2012-10-12T08:28:38.053 に答える
-3

注意深く調べると、ViewPagerによって保存されるビューは最大3つです。あなたは簡単に現在のビューを取得することができます

view     = MyActivity.mViewPager.getChildAt(1);
于 2012-12-12T22:09:20.487 に答える