Is there an official API for centered title on Toolbar like on popular Android apps, in the new material design?

前端 未结 3 1402
说谎
说谎 2021-01-02 02:00

Background

In the past, Google always shown the toolbar to have the title aligned to the left:

https://material.io/develop/android/components/app-bar-layou

相关标签:
3条回答
  • 2021-01-02 02:26

    No official way to do it but subclassing provides most coverage without crazy tricks.

    https://gist.github.com/bmc08gt/40a151e93969f2633b9b92bca4b31e83

    0 讨论(0)
  • 2021-01-02 02:35

    TL;DR: No, there's currently no official way to center the title on a toolbar.


    I don't think there is an official way to do it, at least not yet. But I know that the Flutter framework supports it and it's pretty straight forward: you simply need to pass centerTitle: true to the appbar constructor, as described in this answer. And there's a good chance that the apps you've mentioned in your question were built with Flutter, since both are from Google.

    I think the closest workaround to your expected layout is having the TextView on top of the Toolbar, as shown here:

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    
            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:theme="@style/ThemeOverlay.AppCompat.ActionBar">
            </android.support.v7.widget.Toolbar>
    
            <TextView
                android:layout_centerInParent="true"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/app_name"/>
    
        </RelativeLayout>
    </android.support.design.widget.AppBarLayout>
    

    But it would be really nice if the official Android API could support this the same way flutter does. Maybe you'd like to send a feature request to the Material Components Android Issue Tracker?

    0 讨论(0)
  • 2021-01-02 02:48

    How about textAlignment="center"? a RelativeLayout does the trick, when AppCompatTextView has set layout_width="match_parent"; for example:

    <?xml version="1.0" encoding="utf-8"?>
    <layout
        xmlns:android="http://schemas.android.com/apk/res/android">
    
        <androidx.appcompat.widget.LinearLayoutCompat
            android:id="@+id/customView"
            android:minHeight="?android:attr/actionBarSize"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:orientation="vertical"
            android:gravity="top">
    
            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">
    
                <!-- Home Button -->
                <include
                    layout="@layout/button_home_menu"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="start"/>
    
                <androidx.appcompat.widget.LinearLayoutCompat
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical"
                    android:padding="8dp">
    
                    <androidx.appcompat.widget.AppCompatTextView
                        android:id="@+id/title"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="@string/app_name"
                        android:textAlignment="center"
                        android:textAppearance="?android:attr/textAppearanceLarge"
                        android:textSize="18sp"
                        android:textStyle="bold"/>
    
                    <androidx.appcompat.widget.AppCompatTextView
                        android:id="@+id/subtitle"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="@string/app_version"
                        android:textAlignment="center"
                        android:textAppearance="?android:attr/textAppearanceMedium"
                        android:textSize="12sp"
                        android:textStyle="bold"/>
    
                </androidx.appcompat.widget.LinearLayoutCompat>
    
            </RelativeLayout>
    
        </androidx.appcompat.widget.LinearLayoutCompat>
    
    </layout>
    

    the down-side is, that when showing several menu-items as action buttons - or when displaying extraordinary long strings as title, the title may overlap them - but when only showing one or two action buttons in combination with a title that fits the visually available width, this works just fine - that's because menu config ifRoom would always apply, because there is room. else one could only measure, which side of the toolbar has the most wide items' container - and then adjust the width on the other side's items' container. scaling the font-size depending on the available room might also be an option, to make it fit dynamically.

    0 讨论(0)
提交回复
热议问题