【问题标题】:Get title textview of collapsing toolbar layout获取折叠工具栏布局的标题文本视图
【发布时间】:2016-11-09 11:40:11
【问题描述】:

我有一个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 标题相同的行为中

【问题讨论】:

    标签: android textview toolbar android-collapsingtoolbarlayout


    【解决方案1】:

    这是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);
    

    【讨论】:

    • 感谢您的帮助。不幸的是,没有给出可折叠标题文本视图的预期行为。请看我编辑的帖子
    • 也许this post 会帮助你为元素添加重力。
    【解决方案2】:

    Toolbar 类根据需要创建其子 Views,因此在您为 Toolbar 设置标题之前,TextView 将不存在。完成后,有几个选项。

    您可以遍历 Toolbar 的子 Views - 使用 ViewGroup#getChildCount()getChildAt() 方法 - 寻找 TextView。如果Toolbar 中没有其他TextViews,则标题将是唯一的。如果还有其他内容,则应根据您设置的标题检查文本。

    另一种选择是使用反射来获取标题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;
    }
    

    当然,在对这个方法的返回做任何事情之前,你应该做一个空检查。

    【讨论】:

    • 我已经检查了您的答案作为解决方案,因为它为我返回了正确的文本视图。不幸的是,我无法为 textview 设置任何内容。请看我的代码:protected void onResume() { mTitleTextView = (TextView) getTitleTextView(mToolbar); if(mTitleTextView != null){ mTitleTextView.setText("BLJSDosdjif"); } super.onResume(); }
    • 好吧,CollapsingToolbarLayout 将在Toolbar 上设置内容,就像标题一样。如果您在 super.onResume() 调用之后移动它,该代码可能会起作用。以后有机会我会看看CollapsingToolbarLayout的源代码,但我还没有用太多,所以我不确定它到底是如何处理事情的,atm。
    • 我尝试在 super.onResume() 之后运行代码。不幸的是,它仍然不起作用。如果您能稍微看一下,我将不胜感激。提前谢谢你
    • 好吧,我有一些坏消息。你应该不接受我的回答,因为它目前不正确。 CollapsingToolbarLayoutToolbar 之间的交互我错了。 Toolbar 的标题 TextView 不是您在 CollapsingToolbarLayout 中看到的。布局隐藏Toolbar 的标题,并自行绘制。标题没有TextView。它由内部帮助类直接绘制到布局的Canvas。我们仍然可能能够做您正在尝试的事情,但这需要更多的思考,并且您必须具体说明您要更改的内容
    猜你喜欢
    • 2015-09-30
    • 1970-01-01
    • 2017-04-27
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多