我有三个标签,在一个标签中我请求数据表单后端。重新单击此选项卡后,它会再次重新加载。我希望当我重新加载片段不重新创建时,listView中的所有内容都在内存中。我的代码是这样的:
BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
navigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
Fragment fragment = null;
switch (item.getItemId()) {
case R.id.navigation_home:
fragment = FirstFragment.newInstance();
break;
case R.id.navigation_dashboard:
fragment = SecondFragment.newInstance();
break;
case R.id.navigation_notifications:
fragment = ThreeFragment.newInstance();
break;
}
if (fragment != null) {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.content, fragment);
fragmentTransaction.commit();
}
return true;
}
});
但是当我在Symtems.print.out中看到结果时: - Tab1点击
I/System.out: onCreate main
I/System.out: onAttach 1
I/System.out: onCreate 1
I/System.out: onCreateView 1
I/System.out: onResume main
I/System.out: onResume 1
-Tab2点击
I/System.out: onAttach 2
I/System.out: onCreate 2
I/System.out: onDetach 1
I/System.out: onCreateView 2
I/System.out: onResume 2
- 点击标签1:
I/System.out: onAttach 1
I/System.out: onPause 2
I/System.out: onDetach 2
I/System.out: onCreateView 1
I/System.out: onResume 1
当重新点击标签时,所有片段生命周期再次运行,因为我的代码加载后端再次运行。我怎样才能保留像片段一样onPause当其他标签点击时和OnResume再次点击时。
答案 0 :(得分:0)
您需要在OnCreateView()
中的片段中添加这些行要添加的行
// check if view is null to avoid recreating
if(rootView != null) {
return rootView;
}else {
rootView = inflater.inflate(R.layout.fragment_film,container,false);
}
答案 1 :(得分:0)
哦,伙计,我刚刚去过你的地方。我做了什么,我已经用扩展的ViewPager取代了BottomNavigationView,后者已经关闭了滑动手势。您可以在此处找到它:How do disable paging by swiping with finger in ViewPager but still be able to swipe programmatically?
ViewPager具有setOffScreenPageLimit(numberOfPages)方法,该方法将从屏幕的两侧保留所需数量的片段,不重做所有辛苦工作。
另外,使用简单的TabLayout查看底部的标签。
答案 2 :(得分:0)
您的newInstance()方法可能每次调用它们时都会返回新实例。重写你的newInstance()方法(也许将它重命名为getInstance,它实际上不应该每次创建新实例)使用单例。
示例:
class SomeClass extends Fragment {
private static SomeClass instance = new SomeClass();
public static SomeClass getInstance() {
return instance;
}
}
答案 3 :(得分:0)
对于BottomNavigationView
,我们需要使用BottomNavigationView#setOnNavigationItemReselectedListener
在重新选择的侦听器上设置一个No-Op。希望这能解决您的问题。
BottomNavigationView navView = findViewById(R.id.navigation);
navView.setOnNavigationItemReselectedListener(new BottomNavigationView.OnNavigationItemReselectedListener() {
@Override
public void onNavigationItemReselected(@NonNull MenuItem item) {
//Do nothing here.
}
});