您现在的位置是:首页 >技术教程 >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",结束
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。





U8W/U8W-Mini使用与常见问题解决
QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
stm32使用HAL库配置串口中断收发数据(保姆级教程)
分享几个国内免费的ChatGPT镜像网址(亲测有效)
Allegro16.6差分等长设置及走线总结