我有一个库需要为ActionBar标题使用TextView的颜色。在AppCompat v7 r21之前,我可以找到ViewById并直接从视图中获取颜色。但是,由于某种原因现在不起作用。视图始终为null。我编写了解析整个视图层次结构的代码,并打印出所有TextView的ID,类型和值。标题视图没有ID,我觉得很奇怪。
我注意到的一件事是当我试图获取ActionBar时返回的是工具栏(即使我没有在我的应用程序中使用工具栏)。所以我迭代了工具栏的子视图,每当发现TextView时,我将其文本值与toolbar.getTitle()进行比较,以确保我正在寻找的TextView。不理想,我不确定它是否适用于所有情况。
有谁知道什么是最安全的解决方案?
答案 0 :(得分:23)
无需创建自己的TextView,只需循环工具栏子项即可获得内置标题。
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// loop through all toolbar children right after setting support
// action bar because the text view has no id assigned
// also make sure that the activity has some title here
// because calling setText() with an empty string actually
// removes the text view from the toolbar
TextView toolbarTitle = null;
for (int i = 0; i < toolbar.getChildCount(); ++i) {
View child = toolbar.getChildAt(i);
// assuming that the title is the first instance of TextView
// you can also check if the title string matches
if (child instanceof TextView) {
toolbarTitle = (TextView)child;
break;
}
}
答案 1 :(得分:19)
通常在我的情况下使用工具栏时,如果我正在使用标题进行自定义操作,我将手动膨胀标题视图,然后在XML中设置其属性。工具栏的目的是防止这样的事情发生,这样你就可以更好地控制工具栏的样子
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/my_awesome_toolbar"
android:layout_height="@dimen/standard_vertical_increment"
android:layout_width="match_parent"
android:minHeight="@dimen/standard_vertical_increment"
android:background="@drawable/actionbar_background">
<TextView
style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
android:id="@+id/toolbar_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/Red" />
</android.support.v7.widget.Toolbar>
然后在代码中,你会做这样的事情:
Toolbar toolbar = findViewById(R.id.my_awesome_toolbar);
//Get rid of the title drawn by the toolbar automatically
toolbar.setTitle("");
TextView toolbarTitle = (TextView) toolbar.findViewById(R.id.toolbar_title);
toolbarTitle.setTextColor(Color.BLUE);
我知道这是一篇较旧的帖子,但这是我在工具栏中允许自定义textc颜色和字体的最好方法
答案 2 :(得分:1)
编辑(2018年9月):不要使用它作为Android P反射Android SDK可能会抛出异常!
我用反射得到它。
toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle("Title"); //important step to set it otherwise getting null
TextView title = null;
try{
Field f = toolbar.getClass().getDeclaredField("mTitleTextView");
f.setAccessible(true);
title = (TextView) f.get(toolbar);
title.setText("I have title TextView");
} catch(Exception e){
e.printStackTrace();
}
请注意,如果我的工具栏不设置为支持ActionBar ...
setSupportActionBar(toolbar); // with this set text view behave differently
//and text may not be visible...
答案 3 :(得分:1)
你可以喜欢这个。
Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
TextView title=(TextView )toolbar.getChildAt(0);
这对我有用。
答案 4 :(得分:0)
如果Android更改了图标和文本的顺序,这是将来获得标题的一种方法。
public V get(K key)