在 android 应用中 Toolbar.setTitle 方法无效 - 应用名称显示为标题

Posted

技术标签:

【中文标题】在 android 应用中 Toolbar.setTitle 方法无效 - 应用名称显示为标题【英文标题】:In android app Toolbar.setTitle method has no effect – application name is shown as title 【发布时间】:2014-12-16 16:18:51 【问题描述】:

我正在尝试使用 android-support-v7:21 库创建简单的应用程序。 代码sn-ps: MainActivity.java

public class MainActivity extends ActionBarActivity 

    Toolbar mActionBarToolbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mActionBarToolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);            
        mActionBarToolbar.setTitle("My title");
        setSupportActionBar(mActionBarToolbar);

activity_main.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:fitsSystemWindows="true"
    android:orientation="vertical">

    <android.support.v7.widget.Toolbar            
        android:id="@+id/toolbar_actionbar"
        android:background="@null"
        android:layout_
        android:layout_
        android:fitsSystemWindows="true" />

</LinearLayout>

但显示的是工具栏 %application name% 上的“我的标题”。 好像setTitle 方法没有效果。 我想显示“我的标题”。

统一更新: 之前,styles.xml 是:

<style name="AppTheme" parent="Theme.AppCompat">
    <item name="windowActionBar">false</item>
</style>

所以,我认为没有使用操作栏。 我将NoActionBar 添加到样式父级:

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="windowActionBar">false</item>
</style>

但是问题没有解决。

【问题讨论】:

FWIW,我在 api 级别 22,如果调用 setTitle after 调用 setSupportActionBar,我遇到了同样的问题,但是如果调用 setTitle before我>。如下面的回答中所述,在调用 setSupportActionBar 之后,操作栏将获得工具栏的所有权,并且直接在工具栏上调用可能无法正常工作。我确实意识到,在您的问题中,您 确实 实际上在 setSupportActionBar 之前调用了 setTitle,所以这可能是最近发生的变化。无论如何,使用 getSupportActionBar().setTitle 也同样有效。 ***.com/questions/15560904/… 中提出的相同查询 试试看 - “如何使用 ToolBar 为 Activity 设置标题?” link.medium.com/cGVg3zVr0Z 【参考方案1】:

找到解决方案:

代替:

mActionBarToolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);            
mActionBarToolbar.setTitle("My title");
setSupportActionBar(mActionBarToolbar);

我用过:

mActionBarToolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);            
setSupportActionBar(mActionBarToolbar);
getSupportActionBar().setTitle("My title");

而且它有效。

【讨论】:

不错的一个,但是以这种方式工作而不是另一种工作毫无意义....欢迎使用 android 101 getSupportActionBar().setTitle("My title"); 可能会产生 'java.lang.NullPointerException' @PratikButani 只要在调用 getSupportActionBar() 之前工具栏已设置为 setSupportActionBar() 为什么会这样? 啊哈,很容易解决:assert getSupportActionBar() != null; 伙计们,您真的多次支持@PratikButani 评论吗?如果您使用没有操作栏但自定义支持工具栏 v7 的样式主题,并且您忘记调用 setSupportActionBar(mToolbar),当然您会得到空异常,但如果您调用它,则忽略此消息。只需阅读 - developer.android.com/training/appbar/setting-up.html【参考方案2】:

对于需要在设置 SupportActionBar 一段时间后通过工具栏设置标题的任何人,请阅读此内容。

支持库的内部实现仅在设置 SupportActionBar 时检查 Toolbar 是否有标题(非空)。如果有,则将使用此标题而不是窗口标题。然后,您可以在加载真实标题时设置一个虚拟标题。

mActionBarToolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);
mActionBarToolbar.setTitle("");
setSupportActionBar(mActionBarToolbar);

稍后...

mActionBarToolbar.setTitle(title);

【讨论】:

它有效,但为什么必须这样做对我来说毫无意义。有人解释为什么会这样吗? @Maxwell 考虑到操作栏/工具栏交互的设计是有道理的。 Activity 应该显示一个标题,如果您提供一个没有该标题的工具栏,android 假定您想要传统的 Activity 标题控件。 mActionBarToolbar.setTitle(getResources().getString(R.string.app_name));将确保有一个好的默认标题,同时保持答案的神奇效果 @Bevor 它有效,看看这个答案有多少票......你只是做错了什么 @user25,它对我来说也很糟糕,它删除了一个后退箭头。然后我找到了另一个解决方案:***.com/a/40571324/2914140。 this.setTitle("Title"),其中this - 是对活动的引用。【参考方案3】:

以上答案完全正确,但对我不起作用。

我用以下方法解决了我的问题。

其实我的XML是这样的:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/confirm_order_mail_layout"
    android:layout_
    android:layout_>

    <android.support.design.widget.AppBarLayout
        android:id="@+id/confirm_order_appbar_layout"
        android:layout_
        android:layout_
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/confirm_order_list_collapsing_toolbar"
            android:layout_
            android:layout_
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleMarginEnd="64dp"
            app:expandedTitleMarginStart="48dp"
            app:layout_scrollFlags="scroll|enterAlways">

            <android.support.v7.widget.Toolbar
                android:id="@+id/confirm_order_toolbar_layout"
                android:layout_
                android:layout_
                android:background="?attr/colorPrimary"
                app:layout_scrollFlags="scroll|enterAlways"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

            </android.support.v7.widget.Toolbar>
        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>

我已经尝试了所有选项,毕竟我只是删除了CollapsingToolbarLayout,因为我不需要在那个特定的XML 中使用,所以我的Final XML 就像:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/confirm_order_mail_layout"
    android:layout_
    android:layout_>

    <android.support.design.widget.AppBarLayout
        android:id="@+id/confirm_order_appbar_layout"
        android:layout_
        android:layout_
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.v7.widget.Toolbar
            android:id="@+id/confirm_order_toolbar_layout"
            android:layout_
            android:layout_
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

        </android.support.v7.widget.Toolbar>
    </android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>

现在你必须像上面的答案一样使用setTitle()

mActionBarToolbar = (Toolbar) findViewById(R.id.confirm_order_toolbar_layout);            
setSupportActionBar(mActionBarToolbar);
getSupportActionBar().setTitle("My Title");

现在如果你想同时使用CollapsingToolbarLayoutToolbar 那么你必须使用setTitle() of CollapsingToolbarLayout

CollapsingToolbarLayout collapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.confirm_order_mail_layout);
collapsingToolbarLayout.setTitle("My Title");

愿它对你有所帮助。谢谢。

【讨论】:

有道理,删除CollapsingToolbarLayout 解决了问题 对我来说,为 CollapsingToolbarLayout 设置标题的技巧有效。非常感谢! 由于您的工具栏嵌套在 CollapsingToolbarLayout 下,因此它会被折叠工具栏布局覆盖。这对我有用。 兄弟你救了我的命!!!在使用 collapsingToolbarLayout.seTitle("Title"); 之前,您必须同时 setSupportActionbar 帮了我很多...谢谢【参考方案4】:

您只需使用以下方式更改任何活动名称

Activityname.this.setTitle("Title Name");

【讨论】:

或者只是在 Kotlin 中使用 title = "Title",或者在 Java 中使用 this.setTitle("Title")【参考方案5】:

试试这个,你可以直接在 XML 中定义标题:

 <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_
        android:layout_
        android:background="?attr/colorPrimary"
        app:title="some title"
        app:popupTheme="@style/AppTheme.PopupOverlay">

【讨论】:

最简单但我仍然需要动态自定义标题,如果您有任何想法【参考方案6】:

为每个导航栏片段标题设置标题

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 

    myView = inflater.inflate(R.layout.second_layout, container, false);
    getActivity().setTitle("title");

    return myView;

【讨论】:

【参考方案7】:

试试这个..这个方法对我有用..!!希望它可以帮助某人..!!

<android.support.v7.widget.Toolbar  
 xmlns:app="http://schemas.android.com/apk/res-auto"  
 android:id="@+id/my_awesome_toolbar"  
 android:layout_  
 android:layout_  
 android:background="?attr/colorPrimary"  
 android:minHeight="?attr/actionBarSize"  
 app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" >  

<TextView  
   android:id="@+id/toolbar_title"  
   android:layout_  
   android:layout_  
   android:gravity="center"  
   android:singleLine="true"  
   android:text="Toolbar Title"  
   android:textColor="@android:color/white"  
   android:textSize="18sp"  
   android:textStyle="bold" />  

</android.support.v7.widget.Toolbar>  

要在工具栏中显示徽标,请尝试以下 sn-p。 // 设置可绘制对象

toolbar.setLogo(ContextCompat.getDrawable(context, R.drawable.logo));

让我知道结果。

【讨论】:

谢谢 Ragu Swaminathan。我试图从 appcompact 活动中实现 SupportActionBar 来为我的活动命名,但由于我需要扩展 BaseGameActivity,所以无法做到。然后我去工具栏,但运行时不显示标题。您在工具栏中使用文本框的方法正在运行。推荐给同样情况的人 工具栏有设置app logo的方法。检查我的更新答案【参考方案8】:
 getSupportActionBar().setTitle("Your Title");

【讨论】:

这个答案是一个存根,应该是一个comment,因为这样的简短答案可能被认为是低质量的。一旦你有足够的reputation,你就可以发表评论了。如果您没有足够的声誉,请阅读this post,了解如果您还没有足够的声誉,如何做出贡献。 @ascripter 这是一个答案【参考方案9】:

请参阅https://code.google.com/p/android/issues/detail?id=77763。显然它应该像那样工作。一旦您调用了setSupportActionBar() 方法调用,ActionBar 委托就有责任将调用路由到正确的视图。

【讨论】:

那个 Actionbar 代表是什么?这里 setTitle() 不适用于工具栏,也不适用于支持操作栏。本机操作栏在主题中被禁用。到底是怎么回事?如果只有源代码附件在 Android Studio 中工作,我可以自己追踪问题!【参考方案10】:

不仅仅是.setTitle

onCreate 中支持工具栏 (Appcompat v7) 的更多方法仅适用于

getSupportActionBar().method()

不要使用mToolbar.method()

例子:

getSupportActionBar().setTitle("toolbar title");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

尽管在onCreate 中没有getSupportActionBar() 的情况下,下一个方法可以正常工作

mToolbar.setVisibility(View.VISIBLE);
mToolbar.setNavigationOnClickListener(new View.OnClickListener() 
    @Override
    public void onClick(View v) 
        //
    

问题只有onCreate事件,你仍然可以稍后使用mToolbar.setTitle()而不是烦人的getSupportActionBar().setTitle(),例如如果你在onCreate中添加它会起作用(因为它会在@987654336之后执行@)

mHandler.post(new Runnable() 
    @Override
    public void run() 
        mToolbar.setTitle("toolbar title");
    
);

我更喜欢使用https://***.com/a/35430590/4548520 这个解决方案而不是https://***.com/a/26506858/4548520,因为如果你多次更改标题(在不同的功能中),使用mToolbar.setTitle() 比使用更长的getSupportActionBar().setTitle() 更舒服,而且你不会看到烦人的通知关于空异常,例如getSupportActionBar().setTitle()

【讨论】:

如果您想多次更改标题并使用折叠工具栏,这将有所帮助:***.com/questions/26486730/…【参考方案11】:

对于需要在设置 SupportActionBar (@sorianiv)并且您的 Toolbar 位于 CollapsingToolbarLayout 中的一段时间后通过工具栏设置标题的任何人,请阅读以下内容:

mToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.toolbar_layout);
Toolbar toolbar = findViewById(R.id.toolbar);
//toolbar.setTitle(""); // no need to do this
//mToolbarLayout.setTitle("Title"); // if you need an initial title, do this instead
setSupportActionBar(toolbar);

然后,

mToolbarLayout.setTitle("New Title");

【讨论】:

【参考方案12】:

我试图从片段中重命名工具栏

它帮助了我,我希望能帮助别人

Activity activity = this.getActivity();
Toolbar toolbar = (Toolbar) activity.findViewById(R.id.detail_toolbar);
        if (toolbar != null) 
            activity.setTitle("Title");
        

//toolbar.setTitle("Title"); did not give the same results

截图:

【讨论】:

【参考方案13】:

应用程序标题不会在每个活动上显示为默认标题,您可以在每个活动上插入不同的标题。在 onCreate 下方的活动文件中,只需粘贴一行来设置标题,

@Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("Your Title Here");

只需将文本“Your Title Here”更改为您的文本即可。

【讨论】:

【参考方案14】:

只需在您的适配器中使用它, MainActivity 是您的 AppCompactActivity。 从任何地方调用它。

((MainActivity) context).getSupportActionBar().setTitle(titles.get(position));

【讨论】:

【参考方案15】:

我通过使用 -

toolbar.post(new Runnable() 
            @Override
            public void run() 
                toolbar.setTitle("My Title");
            
        );

【讨论】:

如果您在 UI 线程中更改标题,则不需要使用 post,我认为这是 90% 的情况。【参考方案16】:

如果您同时使用CollapsibleToolbarLayoutToolbar,那么您需要在两种布局中设置标题

onCreate 方法中将您的工具栏设置为操作栏

protected void setUpToolBar() 

    if (mToolbar != null) 
        ((HomeActivity) getActivity()).setSupportActionBar(mToolbar);
        mToolbar.setTitleTextColor(Color.WHITE);
        mToolbar.setTitle("List Detail");
        mToolbar.setNavigationOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                getActivity()
                        .getSupportFragmentManager().popBackStack();
            
        );
        ((HomeActivity) getActivity()).getSupportActionBar()
                .setDisplayHomeAsUpEnabled(true);
    

稍后使用setTitle 方法简单地更新工具栏的标题

 mToolbar .setTitle(productFromShoppingList.getProductName()); 
 mCollapsingToolbar.setTitle(productFromShoppingList.getProductName());

【讨论】:

如果您发现可以设置一次标题,但之后无法更改,则此解决方案有效。确保您正在设置折叠工具栏的标题。 如果您想在一段时间后使用折叠工具栏更改标题,您可以这样做:***.com/questions/26486730/…【参考方案17】:

我有一个奇怪的行为可能会对你有所帮助。 这是有效的,但它仅在 onCreate 中无效:

toolbar.setTitle("title");

尝试在 onCreate 中使用这个:

yourActivityName.this.setTitle("title")

【讨论】:

【参考方案18】:

试试这个:

Xml 代码

<android.support.v7.widget.Toolbar
    android:layout_
    android:layout_
    android:id="@+id/tool_bar"
    android:background="@color/tablayout"
    android:theme="@style/ToolBarStyle"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light">
    <TextView
        android:layout_
        android:layout_
        android:text="@string/app_name"
        android:layout_gravity="center"
        android:id="@+id/toolbar_title"
        android:textSize="18sp"
        android:textColor="@color/white"/>
    </android.support.v7.widget.Toolbar>

Java 代码

protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    toolbar = (Toolbar) findViewById(R.id.tool_bar);
    toolbar_text = (TextView)findViewById(R.id.toolbar_title);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayShowTitleEnabled(false);
    toolbar.setLogo(R.drawable.ic_toolbar);

【讨论】:

【参考方案19】:

如果您的目标是在工具栏中设置一个静态字符串,那么最简单的方法就是在 AndroidManifest.xml 中设置活动标签:

<activity android:name=".xxxxActivity"
          android:label="@string/string_id" />

工具栏将获得此字符串,无需任何代码。 (适用于 v27 库。)

【讨论】:

【参考方案20】:

更改每个不同活动的标题

protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_pizza);
    setTitle(getResources().getText(R.string.title));

【讨论】:

setTitle(R.string.title);事件更容易,但不起作用【参考方案21】:

这可以通过在AndroidManifest.xml 文件中设置您的活动的android:label 属性来完成:

<activity android:name="my activity"
 android:label="The Title I'd like to display" />

然后将这一行添加到onCreate()中:

getSupportActionBar().setDisplayShowTitleEnabled(true);

【讨论】:

【参考方案22】:
 public class MainActivity extends AppCompatActivity implements View.OnClickListener 
    @Override
    protected void onCreate(Bundle savedInstanceState) 
       super.onCreate(savedInstanceState);

       //custom toolbaar
       getSupportActionBar().setTitle("Abhijeet");

    

【讨论】:

【参考方案23】:

虽然与此特定设置没有直接关系,但我发现从将我的工具栏包装在 AppBarLayout 内的 XML 中删除“CollapsingToolbarLayout”可以让一切正常。

所以,这个:

      <android.support.design.widget.AppBarLayout
            android:layout_
            android:layout_>

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_
                app:layout_scrollFlags="scroll|enterAlways"
                app:navigationIcon="@drawable/ic_arrow_back_white_24dp" />

        </android.support.design.widget.AppBarLayout>

而不是这个:

        <android.support.design.widget.AppBarLayout
            android:layout_
            android:layout_>

            <android.support.design.widget.CollapsingToolbarLayout
                android:layout_
                android:layout_
                android:id="@+id/collapsingToolbar"
                android:minHeight="?attr/actionBarSize"
                app:layout_scrollFlags="enterAlways|scroll|snap">

                <android.support.v7.widget.Toolbar
                    android:id="@+id/toolbar"
                    android:layout_
                    app:navigationIcon="@drawable/ic_arrow_back_white_24dp" />
            </android.support.design.widget.CollapsingToolbarLayout>

        </android.support.design.widget.AppBarLayout>

然后,在调用 setSupportActionBar() 之前,我在活动的 onCreate 中设置了标题。

【讨论】:

你可以这样做。如果您真的需要折叠工具栏布局,请检查:***.com/questions/26486730/… @Chantell Osejo 这对我也有用,即使我使用的是相同的布局。谢谢【参考方案24】:

确保添加此选项:

getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE);

【讨论】:

【参考方案25】:

答案在文档中(您可以找到here):

要使用 ActionBar 实用方法,请调用活动的 getSupportActionBar() 方法。此方法返回对 appcompat ActionBar 对象。获得该参考后,您可以致电 任何用于调整应用栏的 ActionBar 方法。例如,要 隐藏应用栏,调用 ActionBar.hide()。

这就是您实际找到的解决方案。只是想参考官方文档(显然很少有人会阅读)。

【讨论】:

【参考方案26】:

在 Kotlin 中你可以这样做:

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar

class SettingsActivity : AppCompatActivity() 

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_settings)

        val toolbar = findViewById<Toolbar>(R.id.toolbar)
        setSupportActionBar(toolbar)
        supportActionBar?.setDisplayHomeAsUpEnabled(true)
        supportActionBar?.setTitle(R.string.title)

    

    override fun onSupportNavigateUp() = true.also  onBackPressed() 


【讨论】:

【参考方案27】:

这是因为您同时使用 Toolbar 和 ActionBar。现在,当您想将 Toolbar 用作操作栏时,您需要做的第一件事是禁用装饰提供的操作栏。

最简单的方法是让您的主题从 Theme.AppCompat.NoActionBar 扩展。

【讨论】:

对不起,我误解了问题。 @HareshChhelana 您发布了答案,但您知道到底是什么问题吗? 我认为与我给出的相关操作栏设置图块问题有关,当您意识到这一点时,我删除了我的 ans,所以现在您不必担心我误解了兄弟。 @PareshMayani 感谢您的回答,但这并不能解决我的问题。请检查更新的问题

以上是关于在 android 应用中 Toolbar.setTitle 方法无效 - 应用名称显示为标题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 应用程序中使用自定义主题

如何在 Chrome 上安装 Android 应用

如何在Android中启动JAVA程序

如何在 Android 应用中启动亚马逊购物应用?

在 Android 应用程序中验证令牌是不是异常?

无法在 Android 设备中启动应用程序