Ope*_*aus 25 java android android-fragments
我有一个活动,我打电话给三个碎片 - 每个碎片相互依赖:
A(ctivity) - > f1(片段1,标题{是|应该}:列表) - > f2(片段2,标题{是|应该}:概述) - > f3(片段3,标题{是|应该}:详情)
ATM我使用以下方法调用向后跳转:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
FragmentManager fragmentManager = getSupportFragmentManager();
if (fragmentManager.getBackStackEntryCount()>0){
fragmentManager.popBackStack();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这很好用.
我在每个片段中覆盖ActionBar标题,如下所示:
ActionBar bar = getSherlockActivity().getSupportActionBar();
bar.setTitle(R.string.title_f3);
Run Code Online (Sandbox Code Playgroud)
当向前导航时(如上所示),这可以完美地工作但向后导航ActionBar的标题没有更新:
f3(title {is | should}:detail) - > f2(title {is}:detail,{should}:overview) - > f1(title {is}:detail,{should}:list)
显然,我可以在显示片段时再次更新它.但是我的调试器永远不会停留在任何方法中,除非像onResume()那样调用.
那么在popBackStack()之后实际上是否在前一个片段中调用了任何方法?
Bur*_*y91 23
我知道答案有点晚了但对于在这里航行的人来说这可能会有所帮助!
首先是第一件事:popBackStack()不会弹出片段,它会弹出片段事务.因此,最后一个片段事务在被调用时会被反转.如果您当前正在显示FragmentA并且您的交易是:
fragmentTransaction.replace(R.id.your_layout, fragmentB);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)
它将使用FragmentB替换FragmentA,并将该事务(不是片段)添加到后端堆栈.如果你然后按下后退按钮,它会从后面的堆栈中弹出事务,这就是"用FragmentB替换这个FragmentA".本质上,该指令反转最后一个事务并将其从执行的事务堆栈中删除.如果原始FragmentA仍然存在,则使用该片段.如果它被摧毁了,它会成为一个新的.
因此,如果片段尚未被销毁,则在使用popBackStack()后调用片段,将调用onStart()和onResume()方法.如果先前已经破坏了Fragment,那么将从onAttach()开始调用生命周期方法.这与按活动上的后退按钮相同.
现在重要一点,当我们弹回堆栈时会发生什么重新碎片生命周期?就像在碎片事务被颠倒之前说的那样:
场景1:您的fragmentB在事务之前尚未存在.在这种情况下,onCreate()和onAttach()方法在事务期间被调用,因此如果你调用popBackStack()并反转事务,片段将被销毁和分离(注意FragmentA可能已经存在,所以替换它不会像我们一样破坏它不要撤消片段创建).在这种情况下,将从onAttach()开始调用生命周期方法.
场景2:您的fragmentB在事务之前已经存在.在这种情况下,片段不会被销毁,下次访问时会调用onStart()和onResume()方法.
这个人在这里解释了一些关于使用popbackstack的事情()http://vinsol.com/blog/2014/09/19/transaction-backstack-and-its-management/和片段生命周期http://vinsol.com/博客/ 2014/10/22/fragment-view-state-retention-a-dirty-solution /.其他相关帖子也值得一读!
在您的BaseActivity中使用addOnBackStackChangedListener方法,该方法将在任何Backstack更改时被调用
getSupportFragmentManager().addOnBackStackChangedListener(
new FragmentManager.OnBackStackChangedListener() {
public void onBackStackChanged() {
FragmentManager fm = getSupportFragmentManager();
if (fm != null) {
int backStackCount = fm.getBackStackEntryCount();
if (backStackCount == 0) {
if (getSupportActionBar() != null) {
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu);
}
setToolbarTittle(R.string.app_name);
} else {
if (getSupportActionBar() != null) {
getSupportActionBar().setHomeAsUpIndicator(R.drawable.back);
}
}
}
}
});
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
22830 次 |
最近记录: |