tablayout+fragment 添加多个fragment会找不到fragment中的控件
时间: 2023-08-24 16:08:21 浏览: 96
Android使用TabLayout+Fragment实现顶部选项卡
这个问题可能是由于使用了`ViewPager`的缓存机制,导致`Fragment`的`View`被销毁后无法重新找到控件。解决方案可以尝试以下两种方法:
1. 不使用`ViewPager`的缓存机制
可以通过重写`ViewPager`的`setUserInputEnabled()`方法关闭缓存机制,代码如下:
```java
public class NoCacheViewPager extends ViewPager {
public NoCacheViewPager(Context context) {
super(context);
}
public NoCacheViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void setUserInputEnabled(boolean enabled) {
super.setUserInputEnabled(enabled);
setOffscreenPageLimit(enabled ? 1 : 0);
}
}
```
然后在布局文件中使用`NoCacheViewPager`替换`ViewPager`即可。
2. 使用`FragmentStatePagerAdapter`
`FragmentStatePagerAdapter`是`ViewPager`的一种适配器,它在滑动过程中会销毁不需要的`Fragment`,从而避免了`ViewPager`缓存机制带来的问题。代码如下:
```java
public class MyPagerAdapter extends FragmentStatePagerAdapter {
private List<Fragment> fragments;
public MyPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm, FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
}
```
然后在`ViewPager`中设置适配器时,使用`MyPagerAdapter`替换原来的适配器即可。
```java
MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager(), fragments);
viewPager.setAdapter(adapter);
```
希望这些方案对你有所帮助。
阅读全文