![](/img/trans.png)
[英]onResume() not called when using ViewPager2 and Fragment
[英]How to replace fragment in ViewPager2
我已將ViewPager
遷移到ViewPager2
並將適配器FragmentPageAdapter
遷移到FragmentStateAdaper
。 在FragmentPageAdapter
中有一個名為getItemPostion(Object obj)
的方法,通過使用此方法我可以替換片段。 在FragmentStateAdaper
class 中,該方法不存在如何用FragmentStateAdaper
替換 viewpager2 中的片段。 這是我的適配器:
public class BottomNavigationIcon extends FragmentStateAdapter implements FragChangeListner {
FragmentManager fm;
Fragment tmp;
public BottomNavigationIcon(@NonNull FragmentManager fragment, Lifecycle lc) {
super(fragment,lc);
this.fm=fragment;
}
@NonNull
@Override
public Fragment createFragment(int position) {
if (position == 1)
return SessionFragment.getInstance();
if (position == 2)
return OthersFragment.newInstance();
if (position == 3) {
if (tmp == null)
tmp = SettingsFragment.newInstance();
return tmp;
}
return ProcessFragment.newInstance();
}
@Override
public int getItemCount() {
return 4;
}
@Override
public void replaceFrag() { //here replacing fragment which is not working
fm.beginTransaction().remove(tmp).commit();
tmp = AboutFragment.newInstance();
notifyDataSetChanged();
}
}
在我的設置片段中,我只是調用replaceFrag()
v.findViewById(R.id.about_me).setOnClickListener(v1 -> {
interface.replaceFrag();
});
在遷移之前,我的適配器如下所示:
public class MyAdapter extends FragmentPagerAdapter implements FragChangeListner
{
private final FragmentManager mFragmentManager;
private Fragment tmp;
public MyAdapter(FragmentManager fm)
{
super(fm);
mFragmentManager = fm;
}
@Override
public Fragment getItem(int position)
{
if (position == 1)
return SessionFragment.getInstance();
if (position == 2)
return OthersFragment.newInstance();
if (position == 3) {
if (tmp == null)
tmp = SettingsFragment.newInstance();
return tmp;
}
return ProcessFragment.newInstance();
}
@Override
public int getCount()
{
return 4;
}
@Override
public int getItemPosition(Object object)
{
if (object instanceof SettingsFragment && tmp instanceof AboutFragment)
return POSITION_NONE;
return POSITION_UNCHANGED;
}
@Override
public void replaceFrag()
{ //here replacing fragment which is working
mFragmentManager.beginTransaction().remove(tmp).commit();
tmp = AboutFragment.newInstance();
notifyDataSetChanged();
}
}
}
我的界面是
public interface FragChangeListner()
{
void replaceFrag();
}
有什么不同的方法可以用 FragmentStateAdapter 適配器替換 viewpager2 中的片段
您必須重寫Fragment
中的createFragment(position: Int)
方法,該方法返回各個位置的FragmentStateAdapter
。
createFragment
可以像這樣被覆蓋
override fun createFragment(position: Int): Fragment {
return when (position) {
0 -> FragmentOne()
1 -> FragmentTwo()
else -> FragmentOne()
}
}
除此之外,您還必須覆蓋FragmentStateAdapter
中的getItemCount()
,您必須在其中返回片段總數。
在您的活動中設置 viewpager
private fun setTabs() {
listFragmentTitles = arrayListOf("Fragment1","Fragment2","Fragment3")
viewPagerFragmentAdapter =
ViewPagerFragmentAdapter(this,listFragmentTitles)
binding.viewPager.adapter = viewPagerFragmentAdapter
TabLayoutMediator(
binding.tabLayout, binding.viewPager
) { tab: TabLayout.Tab, position: Int ->
tab.text = listFragmentTitles[position]
}.attach()
}
查看尋呼機適配器
internal class ViewPagerFragmentAdapter(
fragmentActivity: FragmentActivity,
listFragmentTitles: ArrayList<String>
) :
FragmentStateAdapter(fragmentActivity) {
val titlesList = listFragmentTitles
override fun createFragment(position: Int): Fragment {
when (position) {
0 -> return Fragment1()
1 -> return Fragment2()
2 -> return Fragment3()
}
return Fragment1()
}
override fun getItemCount(): Int {
return titlesList.size
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.