获取折叠工具栏布局的标题文本视图

Get title textview of collapsing toolbar layout

我有一个 collapsingToolbarLayout,我需要对标题进行一些额外的设置 TextView

问题:我怎样才能得到那个 TextView 的引用?

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/review_coordinator_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="com.stack.overflow.reviewmaschine.ReviewMaschineActivity"
    tools:ignore="MergeRootFrame">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/app_bar_height"
        android:fitsSystemWindows="true"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed"
            app:toolbarId="@+id/toolbar">

            <android.support.v7.widget.Toolbar
                android:id="@+id/detail_toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

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

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

    <FrameLayout
        android:id="@+id/item_detail_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior = "@string/appbar_scrolling_view_behavior"
        />

    <com.mego.smscloud.reviewmaschine.SaveFloatingActionButton
        android:id="@+id/review_fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:backgroundTint="@color/colorPrimary"
        android:layout_margin="@dimen/fab_margin"
        android:src="@drawable/ic_floppy_white_48dp"
        app:borderWidth="0dp"
        app:elevation="@dimen/fab_elevation"
        app:rippleColor="#00ffff"/>

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

编辑: 简单地将 TextView 添加到 Toolbar 并不能将其集成到与 CollapsingToolbarLayout 标题相同的行为中

这是Toolbar的默认标题 如果您想更改标题,只需调用:

getSupportActionBar().setTitle(String title);

但这只是改变了文本。

但是,如果您想进行更多修改,请将您自己的 TextView 添加到 Toolbar。像那样:

<android.support.v7.widget.Toolbar
            android:id="@+id/detail_toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

    <TextView
          android:id="@+id/title"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"/>

</android.support.v7.widget.Toolbar>

然后在你身上找到标题Activity

TextView title = (TextView) findViewById(R.id.title);

Toolbar class 根据需要创建其 child View,因此 TextView 在您设置标题之前不会存在在 Toolbar 上。完成后,有几个选项。

您可以迭代 Toolbar 的 child Views - 使用 ViewGroup#getChildCount()getChildAt() 方法 - 寻找 TextView.如果 Toolbar 中没有其他 TextView,那么标题将是唯一的。如果还有其他的,您应该根据您设置的标题检查文本。

另一种选择是使用反射来抓取标题 TextView 字段。例如:

private TextView getTitleTextView(Toolbar toolbar) {
    try {
        Class<?> toolbarClass = Toolbar.class;
        Field titleTextViewField = toolbarClass.getDeclaredField("mTitleTextView");
        titleTextViewField.setAccessible(true);
        TextView titleTextView = (TextView) titleTextViewField.get(toolbar);

        return titleTextView;
    }
    catch (NoSuchFieldException | IllegalAccessException e) {
        e.printStackTrace();
    }

    return null;
}

当然,您应该在使用此方法的 return.

执行任何操作之前进行空值检查