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

qlzsbp2j  于 2023-03-18  发布在  Android
关注(0)|答案(7)|浏览(206)

我的活动中有此代码:

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中。请帮助我!

uelo1irk

uelo1irk1#

好吧,最后,在这个愚蠢的事情上花了2天之后,我得到了解决方案(我会说变通办法)。
这可能是一个嵌套的Fragment错误。
我有嵌套的Fragment结构。正如我们所知,Fragment.getActivity()返回父Activity。经过大量调试,我观察到,如果您在方向更改后调用getActivity()(甚至在Fragment.onActivityCreated()内部),它将返回旧Activity的引用,除了在最顶部的父片段中,它将正确返回新创建的Activity
所以我写了这个方法从任意Fragment中获取当前Activity

/**
 * 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();
}
ejk8hzay

ejk8hzay2#

你需要看到的答案写的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");
brqmpdu1

brqmpdu13#

我刚刚遇到了同样的问题,我通过使用getSupportActionBar而不是toolbar解决了它。

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

igsr9ssn4#

当你旋转屏幕的时候,你的activity被重新创建,所以onCreate被再次调用,你没有在那里设置一个标题。
将以下内容添加到onCreate:

actionBar.setTile("Enter title here")
xuo3flqw

xuo3flqw5#

也许你可以改变你的动作栏/工具栏,在你的活动中的onPostCreate()方法中。代码很简单。我多次尝试改变我的模拟器/设备方向,它工作起来很有魅力。

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

ki0zmccv6#

我也遇到了这个问题,因为工具栏的标题在onCreateView设置为空(“”),但屏幕旋转后,标题栏显示的应用程序名称而不是空字符串。这我也尝试在onResume设置空字符串,最后它的工作!谢谢

au9on6nz

au9on6nz7#

在清单文件中添加

<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

相关问题