MaterialDesign设计-Toolbar

Toolbar将会是我们接触的第一个Material控件。

虽说对于Toolbar你暂时应该还是比较陌生的, 但是对于它的另一个相关控件ActionBar,每个活动最顶部的那个标题栏其实就是ActionBar, 之前我们编写的所有程序里一直都有ActionBar的身影。

不过ActionBar由于其设计的原因, 被限定只能位于活动的顶部, 从而不能实现一些Material Design的效果, 因此官方现在已经不再建议使用ActionBar了。 那么本书中我也就不准备再介绍ActionBar的用法了, 而是直接讲解现在更加推荐使用的Toolbar。

Toolbar的强大之处在于, 它不仅继承了ActionBar的所有功能, 而且灵活性很高, 可以配合其他控件来完成一些Material Design的效果, 下面我们就来具体学习一下。

首先你要知道, 任何一个新建的项目, 默认都是会显示ActionBar的, 这个想必你已经见识过太多次了。 那么这个ActionBar到底是从哪里来的呢?打开AndroidManifest.xml文件看一下:

android:theme="@style/AppTheme"Code language: JavaScript (javascript)

打开res/values/styles.xml文件:

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

</resources>Code language: HTML, XML (xml)

这里定义了一个叫AppTheme的主题, 然后指定它的parent主题是Theme.AppCompat.Light.DarkActionBar。 这个DarkActionBar是一个深色的ActionBar主题, 我们之前所有的项目中自带的ActionBar就是因为指定了这个主题才出现的。

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

</resources>Code language: HTML, XML (xml)

而现在我们准备使用Toolbar来替代ActionBar, 因此需要指定一个不带ActionBar的主题, 通常有Theme.AppCompat.NoActionBar 和Theme.AppCompat.Light.NoActionBar这两种主题可选。 其中Theme.AppCompat.NoActionBar表示深色主题, 它会将界面的主体颜色设成深色, 陪衬颜色设成淡色。 而Theme.AppCompat.Light.NoActionBar表示淡色主题, 它会将界面的主体颜色设成淡色, 陪衬颜色设成深色。

修改activity_main.xml中的代码:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</FrameLayout>Code language: HTML, XML (xml)

这里指定了xmlns:app , 也就是说现在可以使用app:attribute 这样的写法了。 但是为什么这里要指定一个xmlns:app 的命名空间呢? 这是由于Material Design是在Android 5.0系统中才出现的, 而很多的Material属性在5.0之前的系统中并不存在, 那么为了能够兼容之前的老系统, 我们就不能使用android:attribute 这样的写法了, 而是应该使用app:attribute。

现在gradle文件配置如下内容(要保证你的支持包已经更新material design哦):

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha7'
    testCompile 'junit:junit:4.12'
}Code language: PHP (php)
dependencies {
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.android.support:design:23.1.1'
}Code language: JavaScript (javascript)

修改后台活动:

package com.example.material;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    }
}Code language: JavaScript (javascript)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注