最近有个需求,需要在一个viewpager下点击fragment的按钮,将当前fragment替换成其他的fragment、再次点击替换后的fragment的按钮。替换回来。
首先是三个fragment布局,只有一个按钮。为了方便展示。vieepager下展示两个,另一个作为替换fragment
activity布局不用说,一个tablayout一个viewpager
然后在activity中声明
private TabLayout mTabLayout;
private ViewPager mViewPager;
//页卡标题
private List<String> tabTitleList = new ArrayList<>();
//界面布局
private List<Fragment> mFragmentList = new ArrayList<>();
//fragment tag
private boolean fragmentsUpdateFlag[] = {false, false};
重点是viewpager设置适配器,这里的getItemPosition要设置成POSITION_NONE;
final FragmentPagerAdapter pagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
@Override
public CharSequence getPageTitle(int position) {
return tabTitleList.get(position);
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
//更换fragment
@Override
public Object instantiateItem(ViewGroup container, int position) {
//得到缓存的fragment
Fragment fragment = (Fragment) super.instantiateItem(container, position);
//得到tag
String fragmentTag = fragment.getTag();
//如果这个fragment需要更新
if (fragmentsUpdateFlag[position % fragmentsUpdateFlag.length]) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
//移除旧的fragment
transaction.remove(fragment);
//替换成新的fragment
fragment = mFragmentList.get(position % mFragmentList.size());
//添加新fragment时必须用前面获得的tag ❶
transaction.add(container.getId(), fragment, fragmentTag);
transaction.attach(fragment);
transaction.commit();
//复位更新标志
fragmentsUpdateFlag[position % fragmentsUpdateFlag.length] = false;
}
return fragment;
}
};
然后在需要fragment中设置监听,需要替换的fragment都像这样设置
public class FragmentOne extends Fragment {
private static OnClickFragmentListener fragmentListener;
private Button button;
private View view;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_one, container, false);
return view;
}
//初始化搜素、监听
private void initView() {
button= (Button) view.findViewById(R.id.btn_one);
//点击更换当前fragment
button.setClickListener(new ItemClickListener() {
@Override
public void onclick(int position) {
fragmentListener.onclick();
}
});
}
public static void setFragmentListener(OnClickFragmentListener listener) {
fragmentListener = listener;
}
}
然后在activity中处理回调
FragmentOne.setFragmentListener(new OnClickFragmentListener() {
@Override
public void onclick() {
//点击切换按钮
//设置fragment2的tag为true
fragmentsUpdateFlag[1] = true;
//替换fragment
mFragmentList.set(1, fragmentTwo);
pagerAdapter.notifyDataSetChanged();
}
});
同理
FragmentTwo.setFragmentListener(new OnClickFragmentListener() {
@Override
public void onclick() {
//点击切换按钮
//设置fragment1的tag为true
fragmentsUpdateFlag[0] = true;
//替换fragment
mFragmentList.set(1, fragmentOne);
pagerAdapter.notifyDataSetChanged();
}
});
大致像这样就行。