如何保持选项卡中的状态片段不重新加载?

时间:2017-04-10 07:31:27

标签: android android-fragments

我有三个标签,在一个标签中我请求数据表单后端。重新单击此选项卡后,它会再次重新加载。我希望当我重新加载片段不重新创建时,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再次点击时。

4 个答案:

答案 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.
        }
    });