【问题标题】:Prevent fragment from recreating every time bottomnavigation tab is clicked防止每次单击底部导航选项卡时重新创建片段
【发布时间】:2017-05-08 10:29:39
【问题描述】:

我在 android 中使用 BottomNavigationView 来制作类似于 Instagram 的应用程序。我正在使用带有导航标签的片段。应用程序最初有 5 个选项卡我已将中间选项卡设置为活动选项卡,并在应用程序启动后加载它。当我单击任何其他选项卡时,会进行网络调用并加载数据。现在,当我按下后退按钮或再次单击最后一个选项卡(在启动时加载)时,将重新创建片段并进行网络调用以加载相同的数据。我想在不重新创建的情况下显示具有相同数据的先前片段。

我尝试过使用

transaction.add(container,fragment);

但无济于事。

我在标签上点击的代码

 if (item.getItemId() == R.id.nav_OverView && _current != R.id.nav_OverView) {
      Overview _overView = new Overview(); 
     _fragmentTransaction.hide(_currentFragment);
     _fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
     _fragmentTransaction.add(R.id.content_base_drawer, _overView);
     _fragmentTransaction.commit();
     _current = R.id.nav_OverView;
      viewIsAtHome = true;
     }

我知道使用 remove 和 add 与使用 replace 相同。

感谢任何帮助。

【问题讨论】:

  • link。或者,如果这对您不起作用,请使用单例类在第一次加载时保存数据,并在之后使用它。
  • 发布您的setOnNavigationItemSelectedListener 代码,您可能正在其中创建片段
  • @marmor 已更新...立即查看

标签: android android-fragments tabs


【解决方案1】:

在创建视图之前,您可以检查视图是否已经创建,下面的代码有助于片段重新创建问题。

View view;

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
{

if (view == null) 

  {
        view = inflater.inflate(R.layout.frag_layout, container, false);
        init(view);
  }

    return view;
}

【讨论】:

    【解决方案2】:

    _overview 设为类字段(而不是局部变量),并将您的侦听器代码更改为:

    另外,使用replace 代替hide+add,这样可以防止Fragment already added 错误。

    替换已添加到容器中的现有片段。这是 与当前为 all 调用 remove(Fragment) 基本相同 添加了使用相同 containerViewId 添加的片段,然后 add(int, Fragment, String) 与此处给出的参数相同。

    查看示例:

    if (item.getItemId() == R.id.nav_OverView && _current != R.id.nav_OverView) {
          if (_overView == null) {
              _overView = new Overview(); 
          }
         _fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
         _fragmentTransaction.replace(R.id.content_base_drawer, _overView);
         _fragmentTransaction.commit();
         _current = R.id.nav_OverView;
         viewIsAtHome = true;
    }
    

    【讨论】:

    • Fragment 已经添加:fragmentName.. 尝试返回上一个片段时出现此错误。虽然指出了类字段的好点,但我完全错过了。
    • 是的,不是重新添加片段,而是应该删除隐藏它的片段
    • 究竟如何?请进行编辑。感谢你的帮助。如何检查片段是否已经加载或第一次运行?如果它已经加载,调用最后一个片段上的隐藏将弹出我认为的倒数第二个片段,而不是像我打开 1 2 3 4 5 然后通过在 5 上调用隐藏打开 2 那样,它会隐藏所有 5 4 3 还是只是最后一个?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多