工具栏(SupportActionBar)标题在方向更改时更改为应用名称

时间:2015-10-13 12:45:32

标签: android android-fragments android-appcompat

我在我的活动中有这个代码:

protected void onCreate(Bundle savedInstanceState) {
    ...
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    ActionBar actionBar = getSupportActionBar();
    if (actionBar != null) {
      actionBar.setDisplayHomeAsUpEnabled(true);
    }
    ...
}

我在onResume()中更新了各种片段中的ActionBar标题:

ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
if (actionBar != null) {
    actionBar.setTitle(title);
}

这样可以正常工作,但在更改方向后,标题会再次更改为应用名称。我怎么能克服这个?

编辑: 在调查了更多之后,我尝试了这个并发现了这种奇怪的行为: 添加了此代码,我在片段中设置标题:

final ActionBar actionBar = ((AppCompatActivity)getActivity()).getSupportActionBar();
if (actionBar != null) {
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            Log.d("SWAPNIL", "IN RUN BEFORE: " + actionBar.getTitle());
            actionBar.setTitle(title);
            Log.d("SWAPNIL", "IN RUN AFTER : " + actionBar.getTitle());
        }
    }, 3000);
}

以下是日志:

10-13 10:27:04.526 3719-3719/com.example.xxxx D/SWAPNIL: onResumeHelp
10-13 10:27:07.528 3719-3719/com.example.xxxx D/SWAPNIL: IN RUN BEFORE: MY APP NAME
10-13 10:27:07.528 3719-3719/com.example.xxxx D/SWAPNIL: IN RUN AFTER : title
10-13 10:27:21.012 3719-3719/com.example.xxxx D/SWAPNIL: onResumeHelp
10-13 10:27:24.013 3719-3719/com.example.xxxx D/SWAPNIL: IN RUN BEFORE: title
10-13 10:27:24.013 3719-3719/com.example.xxxx D/SWAPNIL: IN RUN AFTER : title

它按日志进行了更改,但未在UI中反映出来。 请帮帮我!

6 个答案:

答案 0 :(得分:9)

好吧,最后,在这个愚蠢的事情上花了2天后,我得到了解决方案(我会说解决方法)。

这可能是一个嵌套的Fragment错误。

我有嵌套的Fragment结构。我们知道Fragment.getActivity()会返回父Activity。经过大量的调试后,我观察到如果你在方向改变后调用getActivity()(甚至在Fragment.onActivityCreated()内),它会返回旧Activity的引用,除了在最顶层的父片段中它正确地返回新的创建了Activity

所以我写了这个方法来从任何Activity获取当前Fragment

/**
 * When inside a nested fragment and Activity gets recreated due to reasons like orientation
 * change, {@link android.support.v4.app.Fragment#getActivity()} returns old Activity but the top
 * level parent fragment's {@link android.support.v4.app.Fragment#getActivity()} returns current,
 * recreated Activity. Hence use this method in nested fragments instead of
 * android.support.v4.app.Fragment#getActivity()
 *
 * @param fragment
 *  The current nested Fragment
 *
 * @return current Activity that fragment is hosted in
 */
public Activity getActivity(Fragment fragment) {
    if (fragment == null) {
        return null;
    }
    while (fragment.getParentFragment() != null) {
        fragment = fragment.getParentFragment();
    }
    return fragment.getActivity();
}

答案 1 :(得分:2)

你需要看到sorianiv在这里写的答案: In android app Toolbar.setTitle method has no effect – application name is shown as title

添加其他toolbar.setTitle("")已解决此问题。

    Toolbar toolbar = (Toolbar) root.findViewById(R.id.toolbar);
    toolbar.setTitle("");
        ((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);
    toolbar.setTitle("Profiles");

答案 2 :(得分:1)

旋转屏幕时,您的活动正在重新创建。所以onCreate再次被调用,你还没有在那里设置标题。

将以下内容添加到您的onCreate:

actionBar.setTile("Enter title here")

答案 3 :(得分:1)

我刚遇到同样的问题,我使用getSupportActionBar代替toolbar解决了这个问题。

getSupportActionBar().setTitle("...");

答案 4 :(得分:0)

添加清单文件

<activity
     android:name=".Activity"
     android:configChanges="orientation|screenSize|keyboardHidden"/>

或 onConfigChange()

中的代码
if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){
    // Set Title for Landscape
 }else{
   // Set Title for Portrait

答案 5 :(得分:0)

也许您可以在Activity中的onPostCreate()方法中更改Action Bar / ToolBar。 代码很简单。我尝试多次改变我的模拟器/设备方向,它就像魅力一样......

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onPostCreate(savedInstanceState);
    toolbar.setTitle(mTitle);
}