在 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 101getSupportActionBar().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");
现在如果你想同时使用CollapsingToolbarLayout
和Toolbar
那么你必须使用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】:
如果您同时使用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());
【讨论】:
如果您发现可以设置一次标题,但之后无法更改,则此解决方案有效。确保您正在设置折叠工具栏的标题。 如果您想在一段时间后使用折叠工具栏更改标题,您可以这样做:***.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 方法无效 - 应用名称显示为标题的主要内容,如果未能解决你的问题,请参考以下文章