您现在的位置是:首页 >技术教程 >Android ViewPager2获取当前fragment网站首页技术教程
Android ViewPager2获取当前fragment
简介Android ViewPager2获取当前fragment
在ViewPager中可以使用PagerAdapter中的instantiateItem方法获取指定索引的Fragment,ViewPager2的Adapter中没有相应的方法,怎么获取呢?
如下:
mFragmentManager.findFragmnetByTag("f$index")
index 就是想获取的fragment的索引
1. 从源码里找到相应的API
第一时间肯定想在源码里找到相应的API
发现没有
2. 尝试findFragmnetByTag
还是要看源码,有没有在添加Fragment的时候设置Tag?
从哪里开始找呢?
当然是从VP2的 adapter开始,直接搜索 mFragmentManager 看看都干了啥,
发现
void placeFragmentInViewHolder(@NonNull final FragmentViewHolder holder) {
Fragment fragment = mFragments.get(holder.getItemId());
// ...
mFragmentManager.beginTransaction()
.add(fragment, "f" + holder.getItemId())
.setMaxLifecycle(fragment, STARTED)
.commitNow();
}
找到了tag = "f" + holder.getItemId()
,找个holder.getItemId()
,
androidx.recyclerview.widget.RecyclerView.ViewHolder#getItemId
public final long getItemId() {
return mItemId;
}
找mItemId
,
androidx.recyclerview.widget.RecyclerView.Adapter#bindViewHolder
public final void bindViewHolder(@NonNull VH holder, int position) {
// ...
holder.mItemId = getItemId(position);
// ...
}
也就是在Adapter的bindViewHolder
赋值为 getItemId(position)
找到 androidx.recyclerview.widget.RecyclerView.Adapter#getItemId
public long getItemId(int position) {
// public static final long NO_ID = -1;
return NO_ID;
}
显然应该找子类的 androidx.viewpager2.adapter.FragmentStateAdapter#getItemId
@Override
public long getItemId(int position) {
return position;
}
也就是说是 position,所以tag 就是 "f+$position"
,结束
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。