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


298

我正在尝试使用android-support-v7:21库创建简单的应用程序。

代码段:
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_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:orientation="vertical">

    <android.support.v7.widget.Toolbar            
        android:id="@+id/toolbar_actionbar"
        android:background="@null"
        android:layout_width="match_parent"
        android:layout_height="?actionBarSize"
        android:fitsSystemWindows="true" />

</LinearLayout>

但是显示的是工具栏%application name%上的“ My title”。
似乎setTitle方法无效。
我想显示“我的标题”。

UPD: 以前styles.xml是:

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

因此,我认为未使用actionbar。我添加NoActionBar到样式父:

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

但是问题没有解决。


4
FWIW,我在api级别22上,如果调用setSupportActionBar 之后调用setTitle,我也会遇到相同的问题,但如果在调用setTitle before时,它会起作用。如下面的答案所述,在调用setSupportActionBar之后,操作栏将拥有工具栏的所有权,并且直接在工具栏上进行调用可能无法正常工作。我确实意识到,在您的问题中,您实际上确实在setSupportActionBar之前调用了setTitle,所以这可能是最近发生的变化。无论如何,使用getSupportActionBar()。setTitle都可以正常工作。
JHH 2015年


尝试-“如何使用工具栏设置活动标题?” link.medium.com/cGVg3zVr0Z
Werder

Answers:


558

找到了解决方案:

代替:

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");

而且有效。


27
一个不错的选择,但以这种方式工作没有其他意义。...欢迎来到android 101
DoruChidean 2015年

28
getSupportActionBar().setTitle("My title");可能会产生'显示java.lang.NullPointerException'
PRATIK Butani

8
@PratikButani只要在调用getSupportActionBar()之前将工具栏设置为setSupportActionBar(),为什么会这样?
莱昂

3
啊哈,很容易解决:assert getSupportActionBar()!= null;
莱昂

10
你们真的对@PratikButani评论了很多次吗?如果您使用不带操作栏但自定义支持工具栏为v7的样式主题,而您忘了调用它setSupportActionBar(mToolbar),当然会得到null异常,但是如果您调用它,则可以忽略此消息。刚读- developer.android.com/training/appbar/setting-up.html
user25

115

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

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

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

后来...

mActionBarToolbar.setTitle(title);

它有效,但是为什么这是必须完成的方式对我来说却毫无意义。有谁解释为什么这样做?
麦克斯韦

1
@Maxwell考虑动作栏/工具栏交互的设计是有意义的。Activity应该显示一个标题,如果您提供的工具栏没有该标题,则android会假定您需要传统的Activity标题控件。
画了

1
mActionBarToolbar.setTitle(getResources()。getString(R.string.app_name)); 将确保有一个很好的默认标题,同时保持答案的相同魔术效果
Eslam Sameh Ahmed'May

@起作用,请看此答案有多少票...您只是做错了
user25

@ user25,它对我也不利,它删除了后退箭头。然后我找到了另一个解决方案:stackoverflow.com/a/40571324/2914140this.setTitle("Title"),其中this-是对活动的引用。
CoolMind

80

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

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

实际上我的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_width="match_parent"
    android:layout_height="fill_parent">

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

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/confirm_order_list_collapsing_toolbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            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_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                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所以我刚刚删除了它,所以我的最终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_width="match_parent"
    android:layout_height="fill_parent">

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

        <android.support.v7.widget.Toolbar
            android:id="@+id/confirm_order_toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            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()CollapsingToolbarLayout

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

愿它对您有帮助。谢谢。


1
这很有道理,消除了已CollapsingToolbarLayout解决的问题
blueware's

2
对我来说,设置CollapsingToolbarLayout标题的技巧有效。非常感谢!
mysliwiec_tech

我可以用更改字幕CollapsingToolbarLayout吗?
nrofis

2
由于工具栏嵌套在CollapsingToolbarLayout下,因此它会被折叠的工具栏布局覆盖。这对我有用。
neilQ5'4

2
兄弟,您救了我的命!!!在使用collapsingToolbarLayout.seTitle(“ Title”);之前,必须同时设置setSupportActionbar。
Jacky Chong

35

只需使用以下命令即可更改任何活动名称

Acitivityname.this.setTitle("Title NAme");

1
或者只是title = "Title"在Kotlin或this.setTitle("Title")Java中。
CoolMind

33

试试看,您可以直接在XML中定义标题:

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

最简单的,但我仍需要自定义标题动态,如果你有任何想法
绫萨拉马

15

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

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{
    myView = inflater.inflate(R.layout.second_layout, container, false);
    getActivity().setTitle("title");

    return myView;
}

12

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

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

<TextView  
   android:id="@+id/toolbar_title"  
   android:layout_width="wrap_content"  
   android:layout_height="wrap_content"  
   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>  

要在工具栏中显示徽标,请尝试以下代码段。//设置可绘制

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

让我知道结果。


谢谢Ragu Swaminathan。我试图通过appcompact活动实现SupportActionBar,以为我的活动提供标题,但是由于我需要扩展BaseGameActivity而无法执行。然后我去寻找工具栏,但运行时未显示标题。您使用工具栏内的文本框的方法有效。推荐给处于相同情况的人们
Sarun1001 '16

工具栏上有一种设置应用程序徽标的方法。检查我更新的答案
Ragu Swaminathan

11
 getSupportActionBar().setTitle("Your Title");

2
该答案是一个存根,而应该是一个注释,因为这样的简短答案可能被认为是低质量的。拥有足够的声誉后,您就可以发表评论了。如果您还没有足够的声誉,请阅读这篇文章,了解如果您还没有足够的声誉的话,您应该如何贡献。
作者

@ascripter这是一个答案
Jemshit Iskenderov

8

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


1
那个Actionbar代表是什么?在此,setTitle()不适用于工具栏,也不适用于支持操作栏。主题中的本机操作栏已禁用。到底是怎么了?如果仅源代码附件在Android Studio中有效,我自己就可以找到问题所在!
WindRider 2015年

6

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

它对我有帮助,我希望对其他人有帮助

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

屏幕截图: 在此处输入图片说明


6

不只是关于 .setTitle

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

getSupportActionBar().method()

并且不与 mToolbar.method()

例子:

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

虽然接下来的方法可以正常getSupportActionBar()工作onCreate

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

仅与onCreate事件有关的问题,您仍然可以mToolbar.setTitle()稍后使用而不是烦人getSupportActionBar().setTitle(),例如,如果在其中添加onCreate它将起作用(因为它将稍后在之后执行onCreate

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

我更喜欢使用这种解决方案https://stackoverflow.com/a/35430590/4548520https://stackoverflow.com/a/26506858/4548520因为如果更改标题多次(在不同的功能),它更舒适的使用mToolbar.setTitle()多于getSupportActionBar().setTitle()一个,并且您不会看到有关null异常的烦人通知,例如getSupportActionBar().setTitle()


如果您想多次更改标题并使用折叠的工具栏,则将有所帮助:stackoverflow.com/questions/26486730/…–
user1506104

6

对于在设置SupportActionBar(@sorianiv)之后需要通过工具栏设置标题的任何人,并且Toolbar位于a内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");

5

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

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

只需将文本“此处的标题”更改为您的文本。


4

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

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


3

如果一起使用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());

如果您发现可以设置一次标题,但此后不能更改,则该解决方案有效。确保您正在设置“折叠工具栏”的标题。
Hylianpuffball

如果您想在一段时间后使用折叠的工具栏来更改标题,则可以执行以下操作:stackoverflow.com/questions/26486730/…–
user1506104

2

尝试这个:

XML代码

<android.support.v7.widget.Toolbar
    android:layout_width="match_parent"
    android:layout_height="120dp"
    android:id="@+id/tool_bar"
    android:background="@color/tablayout"
    android:theme="@style/ToolBarStyle"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        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);
}

2

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

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

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


2

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

toolbar.setTitle("title");

尝试在onCreate中使用它:

yourActivityName.this.setTitle("title")

2

更改每个不同活动的标题

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

setTitle(R.string.title); 活动比较容易,但没有用
toshkinl

2
 public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

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

    }
}

1

尽管与该特定设置并不直接相关,但我发现从将工具栏包装在AppBarLayout内的XML中删除“ CollapsingToolbarLayout”可以使所有工作正常进行。

所以这:

      <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_height="?attr/actionBarSize"
                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_width="match_parent"
            android:layout_height="wrap_content">

            <android.support.design.widget.CollapsingToolbarLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                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_height="?attr/actionBarSize"
                    app:navigationIcon="@drawable/ic_arrow_back_white_24dp" />
            </android.support.design.widget.CollapsingToolbarLayout>

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

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


你可以那样做。如果您确实需要折叠的工具栏布局,请检查以下内容:stackoverflow.com/questions/26486730/…–
user1506104

@Chantell Osejo这也为我工作,即使我使用相同的布局。谢谢
Paramjit Singh Rana

1

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

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

然后将此行添加到onCreate():

getSupportActionBar().setDisplayShowTitleEnabled(true);

0

确保添加此选项:

getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE);

0

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

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

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


0

在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() }

}

-2

发生这种情况是因为您同时使用了Toolbar和ActionBar。现在,要使用工具栏作为操作栏,您需要做的第一件事就是禁用装饰提供的操作栏。

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


对不起,我误解了这个问题。
Haresh Chhelana 2014年

1
@HareshChhelana您发布了答案,但是您知道确切的问题是什么吗?
Paresh Mayani 2014年

我认为这与yi给出的此类动作栏相关,并且当您意识到我这时我删除了ans,因此您现在不必担心我被误解的兄弟了。
Haresh Chhelana 2014年

1
@PareshMayani感谢您的回答,但这不能解决我的问题。请检查更新的问题
krossovochkin 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.