繁体   English   中英

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

[英]Add fragment and update actionbar title

我知道有关刷新操作栏标题的问题已得到解答。 但是我的问题是安静的不同。

由于某些原因,我将片段与add方法一起使用,而不将其与replace方法一起使用 因此,先前的片段不会被销毁,并且当返回时,不会重新创建先前的片段。

这是我的配置:

标题为“ FragA”的片段A>标题为“ FragB”的片段B

当我从片段B返回片段A时,操作栏标题应为“ FragA”,但仍为“ FragB”。 问题在于添加方法Fragment A没有重新创建,并且我没有找到刷新它的事件。

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

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

2- fragB.OnDestroyView:恢复先前的操作栏标题

使用此解决方案,结果还可以,但是我发现此解决方案不是很干净。 是否有更好的方法使用带有片段的add方法刷新actionbartitle?

您可以覆盖你的onBackPressed你的活动,并在每次按下它的时候,你再从堆栈中得到片段的名字就知道哪个片段你的电流。

样品:

  @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"
     }
   }

现在知道将哪个片段添加到后置堆栈时,需要在片段上添加标签。 还要确保您调用addToBackStack来将片段放到Backstack中。

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

在所有片段onResume()回调中调用以下代码行。 您无需保存标题。

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

它应该有所帮助。

将公共静态字符串称为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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM