web-dev-qa-db-ja.com

Android ViewPagerは現在のビューを取得します

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

  1. getChildAt(getCurrentItem)は間違ったViewを返します
  2. これは常に機能するわけではありません。時々nullを返し、時々間違ったViewを返します。

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

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

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

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

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

121
lacas

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

View view = MyActivity.mViewPager.getFocusedChild();
8
ZeCodea

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

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

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

そして電話する

adapter.getItem(myViewPager.getCurrentItem());

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

7
Gilian

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

    // .......

}
3
Andrés

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

私が提案する解決策:

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

このメソッドは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;
    }
2
Dmitry Yablokov

これはすべての人にとってどのように機能しますか?

public Object instantiateItem(final ViewGroup container, final int position) {      
    CustomHomeView RL = new CustomHomeView(MainActivity.ctxt);
    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;
}
1
Michael Kern

画面上での最初のアクティビティですか、それともすでにいくつかのレイヤーを重ねていますか?

これを試して:

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

あるいは単に:

findViewById(Android.R.id.content) 

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

((ViewGroup)findViewById(Android.R.id.content)).getChildAt(0)
1
SunnySonic

これを試して

 final int position = mViewPager.getCurrentItem();
    Fragment fragment = getSupportFragmentManager().findFragmentByTag("Android:switcher:" + R.id.rewards_viewpager + ":"
            + position);
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;
            }
        }
1
Kamen Dobrev

フラグメントはシステムタグで検索できます。それは私の仕事です。 OnMeasure関数で使用しました。

id-viewPager ID

position-取得するフラグメント

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

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

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

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

ViewPagerUtils from FabulousFilter を使用しています。

ViewPagerUtils.getCurrentView(ViewPager viewPager)
0