CoordinatorLayout使用(四):和Toolbar的簡單使用

簡單復習

這篇也就簡單使用业栅,和前面關系不大
就暫時不復習了
這篇可能有點啰嗦龙填,并且只是使用,沒有難度
熟悉的同學略過前面而昨,或者整篇略過


Toolbar簡介

Toolbar出來至少也有2年多了
主觀任務帆焕,大體也就是material design中用來替代3.x的actionbar
在v7包中惭婿,需要gradle依賴一下
具體可以參考
鴻洋大神的博客


Toolbar簡單前提條件

  • 在style中添加,隱藏原來的actionbar
    • 一般會寫一個style叶雹,用的時候财饥,繼承它即可

<item name="windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>

- 寫一些樣式的顏色(具體含義看鴻洋的博客)
![](http://upload-images.jianshu.io/upload_images/2800913-f1e98e5c1285820a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  - 簡單的參考  ,一般也會寫一個style浑娜,用的時候佑力,繼承即可
  - ```
<!-- 導航欄 #4876FF    @color/material_2    -->
<item name="colorPrimary">#4876FF</item>
<!-- 任務欄 #3A5FCD    @color/material_3    -->
<item name="colorPrimaryDark">#3A5FCD</item>
<!-- 窗口的背景顏色    @android:color/white    @color/material_1  -->
<item name="android:windowBackground">@android:color/white</item>
<item name="colorAccent">@color/material_1</item>
<!-- 導航欄文字顏色    @android:color/black    @color/material_1  -->
<item name="android:textColorPrimary">@android:color/black</item>

Toolbar簡單例子

建立一個項目以后式散,寫一個Toolbar
這里只有一個Toolbar
對應的layout筋遭,很簡單吧

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:background="?attr/colorPrimary"
        android:minHeight="45dp">

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

在Activity中,設置一下
把Toolbar當成ActionBar
(當然可以設置標題暴拄,副標題漓滔,Logo,NavigationIcon等)
(也可以在xml中設置乖篷,這里略)

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

再關聯(lián)對應的menu响驴,顯示在右上角

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_a0, menu);
    return true;
}

再設置點擊事件

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.dodo1) {
        Toast.makeText(getApplicationContext(),"dodo1", Toast.LENGTH_SHORT).show();
        return true;
    }

    if (id == R.id.dodo2) {
        Toast.makeText(getApplicationContext(),"dodo2", Toast.LENGTH_SHORT).show();
        return true;
    }

    return super.onOptionsItemSelected(item);
}

整個Activity的代碼為:

package com.aohuan.dodo.coordinator.doa0;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

import com.aohuan.dodo.coordinator.R;


/**
 * Created by dodo_lihao on 2016/11/9.
 * qq: 2390183798
 *
 * 簡單的ToolBar
 */
public class MainA0Activity extends AppCompatActivity {

    @Override
     protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_a0);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_a0, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.dodo1) {
            Toast.makeText(getApplicationContext(),"dodo1", Toast.LENGTH_SHORT).show();
            return true;
        }

        if (id == R.id.dodo2) {
            Toast.makeText(getApplicationContext(),"dodo2", Toast.LENGTH_SHORT).show();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

menu的代碼為:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/dodo1"
        android:title="dodo1"
        app:showAsAction="withText|ifRoom"/>
    <item android:id="@+id/dodo2"
        android:title="dodo2"
        android:orderInCategory="100"
        app:showAsAction="withText|ifRoom"/>
</menu>

大體意思,就是
顯示text(如果有圖片撕蔼,文字和圖片都會顯示)
并且豁鲤, 如果放得下就顯示在右上角秽誊,如果放不下,就放在右上角的...中

這里效果大體為:



Toolbar簡單例子2

這里也就給menu添加了圖片
layout添加了可以滑動的TextView

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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:overScrollMode="always"
    android:fitsSystemWindows="true">

    <!--<android.support.design.widget.AppBarLayout-->
        <!--android:id="@+id/abl"-->
        <!--android:layout_width="match_parent"-->
        <!--android:layout_height="wrap_content"-->
        <!--android:theme="@style/AppTheme.AppBarOverlay">-->

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?attr/colorPrimary"
            android:navigationIcon="@drawable/ic_menu_back"
            app:subtitle="Sub Title"
            app:layout_scrollFlags="scroll|snap|enterAlways"/>

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


    <!--app:layout_behavior="@string/appbar_scrolling_view_behavior"-->
    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            style="@style/TextAppearance.AppCompat.Display3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/holo_blue_bright"
            android:text="A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nL\nM\nN\nO\nP\nQ\nR\nS\nT\nU\nV\nW\nX\nY\nZ\nW\nX\nY\nZ" />
    </android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>

自己就不貼代碼了
可以參考琳骡,文章末尾的代碼地址文件
貼一下圖


這里Toolbar會一直顯示


Toolbar和NestedScrollView聯(lián)動

前面不能聯(lián)動锅论,是因為沒有接收的behavior
我們在Toolbar外面添加一個
android.support.design.widget.AppBarLayout

再給Toolbar添加一個
app:layout_scrollFlags="scroll|snap|enterAlways"

還有對應的android.support.v4.widget.NestedScrollView添加一個
app:layout_behavior="@string/appbar_scrolling_view_behavior"

對應的layout

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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:overScrollMode="always"
    android:fitsSystemWindows="true">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/abl"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?attr/colorPrimary"
            android:navigationIcon="@drawable/ic_menu_back"
            app:subtitle="Sub Title"
            app:layout_scrollFlags="scroll|snap|enterAlways"/>

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


    <!--app:layout_behavior="@string/appbar_scrolling_view_behavior"-->
    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <TextView
            style="@style/TextAppearance.AppCompat.Display3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/holo_blue_bright"
            android:text="A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nL\nM\nN\nO\nP\nQ\nR\nS\nT\nU\nV\nW\nX\nY\nZ\nW\nX\nY\nZ" />
    </android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>

這個時候,我們看一下效果

這里app:layout_scrollFlags有一些可以選擇的
具體每種是干什么的楣号?
下面一起來看一看


layout_scrollFlags了解

上面具體的例子最易,對應的滑動效果是由
app:layout_scrollFlags 來設置的
我們查閱一下,發(fā)現(xiàn)有5中可以選擇的(其中snap是后面添加的)

  • scroll:
    • 代碼中枚舉SCROLL_FLAG_SCROLL
    • 所有想滾動出屏幕的view都需要設置這個flag炫狱, 沒有設置這個flag的view將被固定在屏幕頂部藻懒。
  • snap:
    • 代碼中枚舉SCROLL_FLAG_SNAP
    • 在滾動結(jié)束后,如果view只是部分可見视译,它將滑動到最近的邊界嬉荆。
  • enterAlways:
    • 代碼中枚舉SCROLL_FLAG_ENTER_ALWAYS
    • 這個flag讓任意向下的滾動都會導致該view變?yōu)榭梢姡瑔⒂每焖佟胺祷啬J健薄?/li>
  • enterAlwaysCollapsed:
    • 代碼中枚舉SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED
    • 當你的視圖已經(jīng)設置minHeight屬性又使用此標志時酷含,你的視圖只能已最小高度進入员寇,只有當滾動視圖到達頂部時才擴大到完整高度。
  • exitUntilCollapsed:
    • 代碼中枚舉SCROLL_FLAG_EXIT_UNTIL_COLLAPSED
    • 滾動退出屏幕第美,最后折疊在頂端蝶锋。

這里,我們在代碼中
用boolean值存儲狀態(tài)
再用下面的代碼設置效果

private void setToolbarLayoutFlag(){
    AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) toolbar.getLayoutParams();

    params.setScrollFlags(  (isScroll?AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL:0)
            | (isSnap?AppBarLayout.LayoutParams.SCROLL_FLAG_SNAP:0)
            | (isEnterAlways?AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS:0)
            | (isEnterAlwaysCollapsed?AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED:0)
            | (isExitUntilCollapsed?AppBarLayout.LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED:0));
    toolbar.setLayoutParams(params);
}

再給Toolbar添加對應的設置什往,動態(tài)設置扳缕,看一下效果
(中間的TextView會顯示當前設置的狀態(tài),看圖的時候别威,可以觀察設置)

  • scroll相關


    • 這里躯舔,如果設置scroll,也就是為true的時候省古,上面的Toolbar就會跟著滑動粥庄,并且會隱藏
    • 反之,不設置豺妓,也就是false惜互,就不會隱藏,只會固定不動
  • snap相關(scroll條件下)


    • 設置snap必須是scroll為true的情況下琳拭,不然训堆,不能動,也不會有效果
    • 設置snap也就是為true的時候白嘁,是判斷后的彈性坑鱼,它將滑動到最近的邊界
    • 反之,不設置絮缅,也就是false鲁沥,就不會自動滑動
  • enterAlways相關(scroll條件下)


    • 設置enterAlways也就是為true的時候呼股,任意向下的滾動都會讓view(Toolbar)變?yōu)榭梢?/li>
    • 反之,不設置画恰,也就是false卖怜,就需要向下拉到底以后,才會顯示view(Toolbar)
  • enterAlwaysCollapsed相關(scroll阐枣,enterAlways條件下)


    • 設置enterAlwaysCollapsed必須是scroll為true马靠,enterAlways為true的情況下,不然蔼两,不會有效果
    • 設置enterAlwaysCollapsed也就是為true的時候甩鳄,任意向下的滾動都會讓view(Toolbar)變?yōu)閙inHeight的高度可見
    • 反之,不設置额划,也就是false妙啃,enterAlways的效果會全部顯示
  • exitUntilCollapsed相關(scroll條件下)


    • 設置exitUntilCollapsed也就是為true的時候,任意向上的滾動都會讓view(Toolbar)變?yōu)閙inHeight的高度可見俊戳,而不會全部消失
    • 反之揖赴,不設置,也就是false抑胎,會全部消失

中場小節(jié)

CoordinatorLayout中燥滑,
如果NestedScrollView要和Toolbar互動的話(CollapsingToolbarLayout等之后在了解,這里不涉及)
需要注意幾點

  • 外面先要添加AppBarLayout來接收Behavior
  • 再要注意給NestedScrollView
    • 添加app:layout_behavior="@string/appbar_scrolling_view_behavior"
  • 還要注意Toolbar的 layout_scrollFlags屬性

其他理解阿逃,上面已經(jīng)描述
下面簡單看一些例子
這里就只是把android studio默認創(chuàng)建的Activity
簡單修改铭拧,得到一些例子


其他簡單修改1(Tabbed Activity)

按照下面步驟可以創(chuàng)建項目



創(chuàng)建完以后,簡單運行后恃锉,為:



這個時候搀菩,我們想做一個pending的TabLayout
滑動的時候,隱藏上面的Toolbar

于是破托,

  • AppBarLayout中肪跋,Toolbar下面,添加一個TabLayout
  • Toolbar添加app:layout_scrollFlags="scroll|enterAlways"
  • 給ViewPager添加
    • app:layout_behavior="@string/appbar_scrolling_view_behavior"
  • 再給Fragment中添加一點TextView
  • 在Activity中土砂,綁定對應的TabLayout和ViewPager
tabLayout = (TabLayout) findViewById(R.id.tablayout);
tabLayout.setupWithViewPager(vp);
for(int i=0; i<vp.getAdapter().getCount(); i++){
    tabLayout.getTabAt(i).setText(vp.getAdapter().getPageTitle(i));
}

因為是簡單修改州既,就不貼細節(jié)了
我們看看效果

大體就這樣了
代碼見后面的地址


其他簡單修改2(Scrolling Activity)

按照下面步驟可以創(chuàng)建項目



創(chuàng)建完以后,簡單運行后瘟芝,為:



這里和前面還不太一樣易桃,這里是CollapsingToolbarLayout
所以褥琐,我們簡單在CollapsingToolbarLayout中锌俱,添加一個ImageView(自己從小學就比較崇拜的歐拉)

再運行一下,看看結(jié)果

大體就這樣了
代碼見后面的地址


其他簡單修改3(Navigation Drawer Activity)

按照下面步驟可以創(chuàng)建項目



創(chuàng)建完以后敌呈,簡單運行后贸宏,為:

a5.gif

這里也比較簡單造寝,

  • Toolbar添加app:layout_scrollFlags="scroll"
  • 主體NestedScrollView添加app:layout_behavior="@string/appbar_scrolling_view_behavior"
a5-2.gif

大體就這樣了
代碼見后面的地址


簡單小節(jié)

CoordinatorLayout中,NestedScrollView和Toolbar聯(lián)動

注意Toolbar外面要套AppBarLayout
注意給Toolbar添加app:layout_scrollFlags
注意給NestedScrollView添加
app:layout_behavior="@string/appbar_scrolling_view_behavior"

其他的內(nèi)容吭练,后續(xù)一起學習具體代碼诫龙,可以見
https://github.com/2954722256/use_little_demo
對應 coordinator 的 Module

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鲫咽,隨后出現(xiàn)的幾起案子签赃,更是在濱河造成了極大的恐慌,老刑警劉巖分尸,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锦聊,死亡現(xiàn)場離奇詭異,居然都是意外死亡箩绍,警方通過查閱死者的電腦和手機孔庭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來材蛛,“玉大人圆到,你說我怎么就攤上這事”翱裕” “怎么了芽淡?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長豆赏。 經(jīng)常有香客問我吐绵,道長,這世上最難降的妖魔是什么河绽? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任己单,我火速辦了婚禮,結(jié)果婚禮上耙饰,老公的妹妹穿的比我還像新娘纹笼。我一直安慰自己,他們只是感情好苟跪,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布廷痘。 她就那樣靜靜地躺著,像睡著了一般件已。 火紅的嫁衣襯著肌膚如雪笋额。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天篷扩,我揣著相機與錄音兄猩,去河邊找鬼。 笑死,一個胖子當著我的面吹牛枢冤,可吹牛的內(nèi)容都是我干的鸠姨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼淹真,長吁一口氣:“原來是場噩夢啊……” “哼讶迁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起核蘸,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤巍糯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后客扎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鳞贷,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年虐唠,在試婚紗的時候發(fā)現(xiàn)自己被綠了搀愧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡疆偿,死狀恐怖咱筛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杆故,我是刑警寧澤迅箩,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站处铛,受9級特大地震影響饲趋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜撤蟆,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一奕塑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧家肯,春花似錦龄砰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至反镇,卻和暖如春固蚤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背歹茶。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工夕玩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留你弦,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓风秤,卻偏偏與公主長得像鳖目,于是被迫代替她去往敵國和親扮叨。 傳聞我的和親對象是個殘疾皇子缤弦,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容