防止每次点击bottomnavigation选项卡时重新创建片段

问题描述:

我在Android中使用BottomNavigationView来制作一个像Instagram一样的应用程序。我正在使用navigationTabs的片段。应用程序有5个标签初始化我已将中间选项卡设置为活动选项卡,并在应用程序启动后加载它。当我点击任何其他标签网络调用和数据加载。现在,当我按下后退按钮或再次单击最后一个选项卡(启动时加载该选项卡)时,将重新创建片段,并调用网络加载相同的数据。我想用相同的数据显示以前的片段而不重新创建。防止每次点击bottomnavigation选项卡时重新创建片段

我使用

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; 
    } 

我知道使用删除和添加是一样的使用代替。

任何帮助表示赞赏。

+0

看到这个[链接](http://*.com/questions/14354885/android-fragments-backstack)。或者,如果这不会为你工作,使用单例类来保存第一次加载数据,并在它后面使用它。 – ADM

+0

发布您的'setOnNavigationItemSelectedListener'代码,您可能正在创建您的片段 – marmor

+0

@marmor更新...现在检查 – Joe

_overview成类字段(而不是局部变量),并改变你的听众代码如下:

此外,使用replace代替hide + add,这将防止Fragment already added错误。

替换已添加到容器的现有片段。这是 基本相同,调用删除(片段)所有当前 添加片段添加相同containerViewId是然后 加(INT,片段,字符串)这里给出了相同的论点。

见例如:

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; 
} 
+0

片段已添加:fragmentName ..尝试返回到前一个片段时出现此错误。虽然指出了课堂领域的好处,但我完全忽略了这一点。 – Joe

+0

是的,而不是重新添加片段,你应该删除一个隐藏它 – marmor

+0

究竟如何?请进行编辑。感谢你的帮助。如何检查片段是否已经加载或第一次运行?如果它已经加载调用隐藏在最后一个片段将弹出第二个最后一个片段,我认为,而不是所需要的,如果我打开1 2 3 4 5,然后通过调用5隐藏打开2,它会隐藏所有5 4 3或只是最后一个? – Joe

之前创建视图,你可以检查的观点是不与否,下面的代码片段帮助重建问题。

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; 
}