使用AppCompat v7 r21获取ActionBar标题TextView

时间:2014-10-19 21:26:28

标签: android android-support-library android-appcompat

我有一个库需要为ActionBar标题使用TextView的颜色。在AppCompat v7 r21之前,我可以找到ViewById并直接从视图中获取颜色。但是,由于某种原因现在不起作用。视图始终为null。我编写了解析整个视图层次结构的代码,并打印出所有TextView的ID,类型和值。标题视图没有ID,我觉得很奇怪。

我注意到的一件事是当我试图获取ActionBar时返回的是工具栏(即使我没有在我的应用程序中使用工具栏)。所以我迭代了工具栏的子视图,每当发现TextView时,我将其文本值与toolbar.getTitle()进行比较,以确保我正在寻找的TextView。不理想,我不确定它是否适用于所有情况。

有谁知道什么是最安全的解决方案?

5 个答案:

答案 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)