添加片段并更新操作栏标题

时间:2014-08-18 07:59:08

标签: android android-fragments android-actionbar

我知道有关刷新操作栏标题的问题已经得到解答。 但我的问题却与众不同。

我使用添加方法的片段而不是替换方法出于某些原因。因此,之前的片段不会被破坏,当返回时,之前的片段不会重新创建。

这是我的配置:

片段A标题" FragA" >片段B标题为" FragB"

当我从片段B回到片段A时,操作栏标题应为" FragA"但它留下了#34; FragB"。 问题是添加方法片段A没有重新创建,我没有找到要刷新它的事件。

我现在找到的唯一简单解决方案是:

1- fragB.OnResume:保存上一个操作栏标题

2- fragB.OnDestroyView:恢复上一个操作栏标题

使用这个解决方案,结果还可以,但我发现这个解决方案不是很干净。有没有更好的方法来使用添加方法和片段来刷新actionbartitle?

4 个答案:

答案 0 :(得分:2)

您可以覆盖您的onBackPressed活动,每次按下它,然后从 backstack 获取片段的名称,以了解哪个片段你目前在。

<强>样品:

  @Override
   public void onBackPressed() {
    super.onBackPressed();

    int framentCount = this.getFragmentManager().getBackStackEntryCount();
    if(framentCount != 0)
    {
        FragmentManager.BackStackEntry backEntry=getFragmentManager().getBackStackEntryAt(framentCount-1);
        String str=backEntry.getName(); //the tag of the fragment
        if(str.equals("fragA"))
            //set the actionbar title to FragA
        else if(str.equals("fragB"))
            //set the actionbar title to FragB
    }

     FragA myFragA = (FragA)getFragmentManager().findFragmentByTag("MY_FRAGMENTA_A_TAG");
     if (myFragA.isVisible()) {
           //action bar.title="title first fragment"
     }
   }

现在要知道在将片段添加/替换到backstack时,需要将哪个片段放到片段中。还要确保调用addToBackStack将片段放入后台堆栈。

FragmentTransaction.add(int containerViewId, Fragment fragment, String tag)
FragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)

答案 1 :(得分:0)

在onResume()回调中调用所有片段中的以下代码行。你不需要保存标题。

((YourFragmentActivity) getActivity()).setActionBarTitle(YOUR_TITLE);

它应该有帮助。

答案 2 :(得分:0)

在片段上放置一个名为tag的公共静态字符串,然后在标记所在的位置使用它。更具可维护性。

为什么 - 这意味着如果您想要更改标记,您只需在一个地方更改它,减少重构。 (它也用于添加,替换功能 - 如果困惑,请参阅Rod的答案)

我对解决方案的实现类似于Rod在他编辑的答案中解决问题的方法,除了少量代码。

@Override
public void onBackPressed() {
    super.onBackPressed();
    try {
        if (getFragmentManager().findFragmentByTag(FragA.tag) != null) {
            if (getFragmentManager().findFragmentByTag(FragA.tag).isVisible()) {
                getActionBar().setTitle(R.string.FragA_title);
            }
        }

        if (getFragmentManager().findFragmentByTag(FragB.tag) != null) {
            if (getFragmentManager().findFragmentByTag(FragB.tag).isVisible()) {
                getActionBar().setTitle(R.string.FragB_title);
            }
        }
    }
    catch (NullPointerException e) {
    }
}

例如静态标签使用

FragmentTransaction.add(int containerViewId, Fragment fragment, FragA.tag)

答案 3 :(得分:-1)

@覆盖     public void onStop(){       super.onStop();      ((AppCompatActivity)getActivity())。getSupportActionBar()。setTitle(“Title”);    } 覆盖当前片段中的onStop()方法,并给出前一个片段的标题名称。