Android ViewPager 获得当前视图

我有一个 ViewPager,我想得到当前选定的和可见的视图,而不是一个位置。

  1. 返回错误的 View
  2. 这并不总是有效。有时返回 null,有时只是返回错误的视图。

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    
    
    if (isVisibleToUser == true) {
    mFocusedListView = ListView;
    }
    }
    
  3. PageListener on ViewPager with getChildAt() also not working, not giving me the correct View every time.

How can i get current visible View?

View view = MyActivity.mViewPager.getChildAt(MyActivity.mViewPager.getCurrentItem()).getRootView();
ListView listview = (ListView) view.findViewById(R.id.ListViewItems);
106381 次浏览

这是你在屏幕上的第一个活动还是你们已经互相分层了?

试试这个:

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

或者只是:

findViewById(android.R.id.content)

也取决于你想尝试什么:

((ViewGroup)findViewById(android.R.id.content)).getChildAt(0)

请看看这个

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

否则验证 这个链接

我想通了。我所做的就是给所有的 Views/ListViews 命名为 setTag(),然后调用 findViewWithTag(mytag)mytag作为标记。

不幸的是,没有其他办法可以解决这个问题。

如果仔细检查,ViewPager 最多保存了3个视图。 您可以通过以下方法轻松获得当前视图

view     = MyActivity.mViewPager.getChildAt(1);

我只是遇到了同样的问题,并用以下方法解决了它:

View view = MyActivity.mViewPager.getFocusedChild();

可以通过从调用 myAdapter.yourListItens.get(myViewPager.getCurrentItem());的适配器访问 itens 列表来获取当前元素 如您所见,ViewPager 可以检索适配器元素的当前索引(当前页)。

如果你使用的是 FragmentPagerAdapter,你可以这样强制转换:

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

打电话

adapter.getItem(myViewPager.getCurrentItem());

这对我来说非常有效;)

如果您没有很多页,您可以安全地应用 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;
}

在我努力寻找一种装饰 android 视图的方法的过程中,我想我已经为我在 我的博客中记录的 OP 的问题定义了替代解决方案。我链接到它的代码似乎有点太多,包括在这里的一切。

我提出的解决方案是:

  • 保持适配器和视图完全分离
  • 人们可以很容易地查询一个视图与任何索引形式的查看页面,他将返回要么 null,如果这个视图当前没有加载或相应的视图。

试试这个

 final int position = mViewPager.getCurrentItem();
Fragment fragment = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.rewards_viewpager + ":"
+ position);

我必须做得更通用一些,所以我决定使用 ViewPager 的私有“位置”

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

使用扩展 PagerAdapter 的 Adapter,并在 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);
}


// .......


}

我正在使用 法布鲁斯过滤器中的 ViewPagerUtils:

ViewPagerUtils.getCurrentView(ViewPager viewPager)

你可以通过系统标签找到片段。这是我的工作。我用它在 OnMeasure函数。

id-viewPager ID

你想得到的 position片段

重要! 如果片段是在适配器中创建的,那么就会得到这个片段。因此必须检查 supportedFragmentManager.findFragmentByTag("android:switcher:" + id + ":" + position)否决

你可以看到这样的景色:

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

您不应该在适配器中给定制标记

我对 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;
}
viewpager.getChildAt(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) {
            

}


})

使用此方法。

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