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

时间:2014-10-21 12:27:53

标签: android toolbar android-support-library

我正在尝试使用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>

但是,工具栏上显示的不是“我的标题”,而是显示应用程序名称% 似乎setTitle方法没有效果 我想展示“我的头衔”。

UPD: 之前,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>

但问题没有解决。

26 个答案:

答案 0 :(得分:519)

找到解决方案:

而不是:

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

它有效。

答案 1 :(得分:107)

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

支持库的内部实现只是检查工具栏在设置SupportActionBar时是否具有标题(非空)。如果有,则使用此标题代替窗口标题。然后,您可以在加载实际标题时设置虚拟标题。

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

...后

mActionBarToolbar.setTitle(title);

答案 2 :(得分:70)

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

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

实际上我的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()的{​​{1}}

CollapsingToolbarLayout

愿它能帮到你。谢谢。

答案 3 :(得分:33)

只需使用

更改任何活动名称即可
Acitivityname.this.setTitle("Title NAme");

答案 4 :(得分:31)

试试这个,你可以直接用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">

答案 5 :(得分:13)

设置每个Navbar片段标题的标题

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

    return myView;
}

答案 6 :(得分:11)

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

<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>  

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

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

让我知道结果。

答案 7 :(得分:10)

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

答案 8 :(得分:8)

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

答案 9 :(得分:5)

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

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

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

截图: enter image description here

答案 10 :(得分:5)

对于在设置SupportActionBar(@sorianiv) AND 之后需要一段时间通过工具栏设置标题的任何人,您的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");

答案 11 :(得分:5)

这不仅仅是关于.setTitle

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

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/4548520而不是https://stackoverflow.com/a/26506858/4548520,因为如果您多次更改标题(使用不同的功能),使用mToolbar.setTitle()比使用更长的getSupportActionBar().setTitle()更方便并且您没有看到与getSupportActionBar().setTitle()

一样的关于null异常的恼人通知

答案 12 :(得分:4)

只需在适配器中使用它, MainActivity是您的AppCompactActivity的位置。 从任何地方打电话。

try 
{
    final Field field = collapsingToolbarLayout.getClass().getDeclaredField("mCollapsingTextHelper");
    field.setAccessible(true);

    final Object object = field.get(collapsingToolbarLayout);
    final Field tpf = object.getClass().getDeclaredField("mTextPaint");
    tpf.setAccessible(true);

    ((TextPaint) tpf.get(object)).setTextSize(getResources().getDimension(R.dimen.textsize));
} 
catch (Exception ex) {
}

答案 13 :(得分:4)

我使用 -

使其成功
toolbar.post(new Runnable() {
            @Override
            public void run() {
                toolbar.setTitle("My Title");
            }
        });

答案 14 :(得分:2)

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

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

    }
}

答案 15 :(得分:2)

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

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

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

答案 16 :(得分:2)

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

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

工具栏将在没有任何代码的情况下获取此字符串。 (适用于v27库。)

答案 17 :(得分:2)

我有一种可能对你有帮助的奇怪行为 这是有效的,但它仅对onCreate没有影响:

toolbar.setTitle("title");

尝试在onCreate中使用它:

yourActivityName.this.setTitle("title")

答案 18 :(得分:2)

如果您使用CollapsibleToolbarLayout以及Toolbar,那么您需要在两个布局中设置标题

将工具栏设置为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());

答案 19 :(得分: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);
}

答案 20 :(得分:2)

更改每个不同活动的标题

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

答案 21 :(得分:1)

可以通过在AndroidManifest.xml文件中设置活动的<activity android:name="my activity" android:label="The Title I'd like to display" /> 属性来完成此操作:

getSupportActionBar().setDisplayShowTitleEnabled(true);

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

rnpm link

答案 22 :(得分:0)

虽然没有立即与这个特定的设置相关,但我发现从我的XML中删除“CollapsingToolbarLayout”将我的工具栏包装在AppBarLayout中使一切正常。

所以,这个:

class LoggingService {
    func sayWorld() {
        print("world")
    }
}

protocol LoggerType {
    func sayWorld()
}

extension LoggerType {
    private var loggerInstance: LoggingService {
        print("init")
        return LoggingService()
    }

    func sayWorld() {
        self.loggerInstance.sayWorld()
    }
}

class ViewMock: LoggerType {
    init() {

    }
}

let viewObj = ViewMock()
viewObj.sayWorld()

而不是:

      <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>

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

答案 23 :(得分:0)

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

  

要使用ActionBar实用程序方法,请调用活动   getSupportActionBar()方法。此方法返回对a的引用   appcompat ActionBar对象。一旦你有了这个参考,你可以打电话   用于调整应用栏的任何ActionBar方法。例如,到   隐藏应用栏,调用ActionBar.hide()。

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

答案 24 :(得分:0)

确保添加此选项:

getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE);

答案 25 :(得分:-3)

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

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