Android片段:何时使用隐藏/显示或添加/删除/替换?


117

假设我希望用另一个容器视图替换当前片段。最好使用replace ...

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, null);
    ft.commit();

...或以下内容,以及显示和隐藏?

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.hide(oldFragment);
    ft.show(newFragment);
    ft.commit();

一种这样做的方式更有效吗?无法找到有关何时使用这些方法或它们如何影响所涉及片段的生命周期的大量信息。谢谢!


如果我从片段A转到片段B,然后又回到片段A,我如何确保诸如onCreateView之类的生命周期事件未在片段A上调用?按标签查找片段有效吗?
blackawk

Answers:


135

您应该考虑您打算对片段执行的操作,以确定要遵循的路径。如果您使用FragmentTransaction隐藏片段,则它仍可以处于其生命周期的运行状态,但是其UI已从窗口分离,因此不再可见。因此,从技术上讲,您仍然可以与片段进行交互,并在以后需要时重新附加其UI。如果替换了片段,实际上是将其从容器中拉出,它将经历生命周期中的所有拆解事件(onPause,onStop等),如果由于某种原因再次需要该片段,则必须将其重新插入容器中,然后再次运行其所有初始化。

如果很有可能再次需要该片段,则只需将其隐藏即可,因为与完全重新初始化相比,重新绘制其布局要花费更少的钱。


5
对于我们的需求,初始化片段非常昂贵,因此我们可能会继续hide()show()节省下来!谢谢你!
罗伯特·卡尔

2
嗨,当您说从窗口分离时,您是说onDetach()回调将被调用吗?我做了实验,似乎并非如此。
GingerJim

可能他的意思是“分离”;片段也可以分离/重新附加(另外添加/删除,显示/隐藏)
comeGetSome 2013年

1
@Zainodis,我也有同样的问题。我的解决方案是将片段的隐藏状态保存在onSaveInstanceState()中-savedInstanceState.putBoolean(STATE_HIDDEN,isHidden()); 然后在onCreate()中,如果(savedInstanceState!= null)返回隐藏状态,并且如果该片段被隐藏,则在事务中将其隐藏。
worawee.s 2015年

1
@ worawee.s嘿,谢谢您的更新:)!我不久前就解决了这个问题-我真的不需要隐藏/显示等,因此我完全删除了它,现在我要在单个窗格中使用诸如添加/替换或单个片段活动之类的标准(基本上是主要细节流) 。对于仍在使用hide的用户,您的解决方案将非常有帮助-并且不检查saveInstance!= null是我之前犯的错误之一。
AgentKnopf

5

您基本上回答了自己。如果要替换(因此不再需要旧的片段),replace()如果要暂时隐藏它,请使用hide()


基本上替换并没有removeAll。我找不到匹配的hideAll :(
AlikElzin-kilaka

@ AlikElzin-kilaka在我的活动3片段中的所有三个片段中,我从网络中获取数据,我应该遵循哪种方法
Mansukh Ahir 16'Apr

0

我在我的活动中使用了hide / Show方法,其中有4个片段解决了我的问题,但是当我显示对话框时,它会随机出现一段时间,当我使用add和replace方法时会给出窗口错误的令牌异常,因此不会发生错误的令牌异常,所以我认为show /隐藏方法并不完美

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.