Android ActionBar和ToolBar的使用

參考

1葵孤、android中的ActionBar和ToolBar
2且叁、『Material Design入門學習筆記』主題與AppCompatActivity(附demo)
3谴分、Android開發(fā):最詳細的 Toolbar 開發(fā)實踐總結
4谬擦、Toolbar設置詳解----掉坑總結

前言

自android5.0開始颗品,AppCompatActivity代替ActionBarActivity,而且ToolBar也代替了ActionBar侧巨,下面就是ActionBar和ToolBar的使用

ActionBar

1舅锄、截圖

image.png

2、使用

2.1司忱、AppCompatActivity和其對應的Theme
  • AppCompatActivity使用的是v7的ActionBar(和默認的ActionBar使用起來略有區(qū)別皇忿,一會代碼中會有體現(xiàn))
  • Theme的話繼承于Theme.AppCompat.Light.DarkActionBar,系統(tǒng)提供的深色系的actionbar坦仍,那么按鈕鳍烁,文字,和菜單是白色的
//Activity
public class ActionBarActivity extends AppCompatActivity

//style
<!--默認所有activity的actionbar的theme-->
    <style name="AppCompatActivity_ActionBarTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:textAllCaps">false</item>
    </style>
2.2繁扎、ActionBar的使用
  • 獲取actionbar:\color{red}{這里v7的是getSupportActionBar()幔荒,默認的是getActionBar()}
        //AppCompatActivity use v7 action bar
        actionBar = this.getSupportActionBar();
        //Activity use action bar
        //actionBar = this.getActionBar();

        if(actionBar == null){
            return;
        }
  • 設置主副標題
        //主標題
        actionBar.setTitle("ActionBar Title");
        //副標題
        actionBar.setSubtitle("Sub Title");
  • 設置navigation up按鈕:可見+可用+更換圖標
        //左側按鈕:可見+可用+更換圖標
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setHomeButtonEnabled(true);
        //actionBar.setHomeAsUpIndicator(R.mipmap.back_white);
  • 設置navigation up按鈕的監(jiān)聽:復寫onSupportNavigateUp(),\color{red}{但是如果有menu復寫onOptionsItemSelected函數(shù)的話梳玫,則onSupportNavigateUp()將不會被調用}
/**
     * 復寫:左側按鈕點擊動作
     * android.R.id.home
     * v7 actionbar back event
     * 注意:如果復寫了onOptionsItemSelected方法爹梁,則onSupportNavigateUp無用
     * */
    @Override
    public boolean onSupportNavigateUp() {
        finish();
        return super.onSupportNavigateUp();
    }

    /**
     * 復寫:左側按鈕點擊動作
     * android.R.id.home
     * actionbar back event
     * 注意:如果復寫了onOptionsItemSelected方法,則onSupportNavigateUp無用
    @Override
    public boolean onNavigateUp() {
        finish();
        return super.onNavigateUp();
    }* */
  • 設置logo(icon等):用logo代替icon提澎,不知道為什么不靈姚垃??
        //設置logo
        actionBar.setLogo(android.R.mipmap.sym_def_app_icon);
        actionBar.setDisplayUseLogoEnabled(true);
        //設置icon:use logo instead of an icon
        //actionBar.setIcon(R.mipmap.ic_launcher);
  • 設置菜單menu和對應監(jiān)聽:android.R.id.home就是左側的navigation up按鈕
   /**
     * 復寫:添加菜單布局
     * */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);
        return true;
    }

    /**
     * 復寫:設置菜單監(jiān)聽
     * */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
                //actionbar navigation up 按鈕
            case android.R.id.home:
                finish();
                break;

            case R.id.action_refresh:
                Toast.makeText(this, "Refresh selected", Toast.LENGTH_SHORT).show();
                break;
            case R.id.action_add:
                Toast.makeText(this, "Add selected", Toast.LENGTH_SHORT).show();
                break;
            case R.id.action_settings:
                Toast.makeText(this, "Settings selected", Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
        return true;
    }
  • 設置tab和對應監(jiān)聽
        //增加actionbar 下面的tab按鈕
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        actionBar.addTab(actionBar.newTab().setText("Tab 1").setTabListener(new ActionBar.TabListener() {
            @Override
            public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
                Toast.makeText(ActionBarActivity.this, "Tab 1 select",Toast.LENGTH_SHORT).show();
            }
            @Override
            public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { }
            @Override
            public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { }
        }));
        actionBar.addTab(actionBar.newTab().setText("Tab 2").setTabListener(new ActionBar.TabListener() {
            @Override
            public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
                Toast.makeText(ActionBarActivity.this, "Tab 2 select",Toast.LENGTH_SHORT).show();
            }
            @Override
            public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { }
            @Override
            public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { }
        }));
  • 或者完全自定義
       //自定義
        actionBar.setCustomView(R.layout.actionbar_title);
        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
  • 隱藏虱朵、顯示actionbar
case R.id.btn_hide:
                if(actionBar != null){
                    /**
                     * 隱藏actionbar
                     * 1莉炉、有actionbar情況下:actionBar.hide();
                     * 2、直接使用Theme.Holo.NoActionBar
                     * 3碴犬、theme中添加屬性
                     *      <item name="windowActionBar">false</item>
                     *      <item name="windowNoTitle">true</item>
                     * 4、在setContent之前 Window feature must be requested before adding content
                     *    AppCompatActivity: supportRequestWindowFeature(Window.FEATURE_NO_TITLE)梆暮,
                     *    Activity: requestWindowFeature(Window.FEATURE_NO_TITLE);
                     *
                     * */
                    actionBar.hide();
                }
                break;

            case R.id.btn_show:
                if(actionBar != null){
                    actionBar.show();
                }
                break;

-------------------------------------分割線-------------------------------

Menu(共通的菜單服协,不細說)

1、showAsAction屬性

  • always表示永遠顯示在ActionBar中啦粹,如果屏幕空間不夠則無法顯示
  • ifRoom表示屏幕空間夠的情況下顯示在ActionBar中偿荷,不夠的話就顯示在overflow中
  • never則表示永遠顯示在overflow中
  • withText:這個值使菜單項和它的圖標,文本一起顯示

2唠椭、布局

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <!--showAsAction屬性
        always表示永遠顯示在ActionBar中跳纳,如果屏幕空間不夠則無法顯示
        ifRoom表示屏幕空間夠的情況下顯示在ActionBar中,不夠的話就顯示在overflow中
        never則表示永遠顯示在overflow中
        withText:這個值使菜單項和它的圖標贪嫂,文本一起顯示-->

    <!--menuCategory:同種菜單項的種類寺庄。該屬性可取4個值:container、system、secondary和alternative斗塘。-->

    <!--orderInCategor:同種類菜單的排列順序赢织。該屬性需要設置一個整數(shù)值-->

    <item
        android:id="@+id/action_refresh"
        android:icon="@mipmap/refresh"
        android:title="Refresh"
        app:showAsAction="always" />
    <item
        android:id="@+id/action_add"
        android:icon="@mipmap/add"
        android:title="Add"
        app:showAsAction="ifRoom" />
    <item
        android:id="@+id/action_settings"
        android:icon="@mipmap/settings"
        android:title="Settings"
        app:showAsAction="never">
    </item>
</menu>

-------------------------------------分割線-------------------------------

ToolBar

了解了ActionBar的話,那么ToolBar和其差不多馍盟,更加強大于置,更加符合MD風格,然后就代替ActionBar贞岭,使用起來差不多八毯,但是又UI上的坑

1、截圖:顏色不正常的

image.png

2瞄桨、使用

2.1话速、隱藏ActionBar有4中方式
  • 1、如果繼承了theme有actionbar的則讲婚,在setContentView方法之前設置:v7的supportRequestWindowFeature(Window.FEATURE_NO_TITLE);或者非v7的requestWindowFeature(Window.FEATURE_NO_TITLE);
  • 2尿孔、theme直接繼承沒有actionbar的,比如說:Theme.AppCompat.Light.NoActionBar
  • 3筹麸、theme中沒設置屬性沒有actionbar:<item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
  • 4活合、actionBar.hide();
2.2、AppCompatActivity和其對應的Theme
//activity
public class ToolBarActivity extends AppCompatActivity

//style
    <!--默認所有activity的toolbar的theme-->
    <!--<style name="AppCompatActivity_ToolBarTheme" parent="Theme.AppCompat.Light.NoActionBar">-->
    <style name="AppCompatActivity_ToolBarTheme" parent="Theme.AppCompat.Light">
        <!--不要actionbar物赶,不要title-->
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>

        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:textAllCaps">false</item>
    </style>
ToolBar的使用
  • toolbar在layout中布局代碼:
    \color{red}{這里面有UI的坑白指,就是深色toolbar,文字也是黑色的酵紫,難看}
<!--這里是代替actionbar的告嘲,當然可以設置在baseactivity中通用,然后include進來-->
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:background="?attr/colorPrimary"
        android:layout_height="wrap_content"
        android:minHeight="?attr/actionBarSize">

    </android.support.v7.widget.Toolbar>
  • 獲取toolbar并取代actionbar奖地,這里設置toolbar的標題必須在setSupportActionBar之前橄唬,否則無用
       //隱藏默認actionbar
        ActionBar actionBar = getSupportActionBar();
        if(actionBar != null){
            actionBar.hide();
        }

        //獲取toolbar
        toolBar = findViewById(R.id.toolbar);
        //主標題,必須在setSupportActionBar之前設置参歹,否則無效仰楚,如果放在其他位置,則直接setTitle即可
        toolBar.setTitle("ToolBar Title");
        //用toolbar替換actionbar
        setSupportActionBar(toolBar);
  • 設置副標題
        //副標題+顏色
        toolBar.setSubtitle("Sub Title");
  • 設置navigation up按鈕的圖標和點擊監(jiān)聽
        //左側按鈕:可見+更換圖標+點擊監(jiān)聽
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);//顯示toolbar的返回按鈕
        //toolBar.setNavigationIcon(R.mipmap.back_white);
        toolBar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
       
  • 設置logo
         //設置logo
        toolBar.setLogo(android.R.mipmap.sym_def_app_icon); 
  • 設置菜單menu及其監(jiān)聽
/**
     * 復寫:添加菜單布局
     * */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);
        return true;
    }

    /**
     * 復寫:設置菜單監(jiān)聽
     * */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_refresh:
                Toast.makeText(this, "Refresh selected", Toast.LENGTH_SHORT).show();
                break;
            case R.id.action_add:
                Toast.makeText(this, "Add selected", Toast.LENGTH_SHORT).show();
                break;
            case R.id.action_settings:
                Toast.makeText(this, "Settings selected", Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
        return true;
    }
       
  • 加載自定義toolbar:直接在toolbar的layout中寫即可犬庇,可以是文字居中等等
  • 隱藏僧界、顯示toolbar
 case R.id.btn_hide:
                if(toolBar != null){
                    toolBar.setVisibility(View.GONE);
                }
                break;

            case R.id.btn_show:
                if(toolBar != null){
                    toolBar.setVisibility(View.VISIBLE);
                }
                break;

3、截圖:顏色正常的

4臭挽、用ToolBar 的Theme和PopupTheme來控制顏色正常捂襟,或自定義顏色

4.1、ToolBar顯然顏色不對欢峰,那找找為啥ActionBar的時候對的葬荷,直覺告訴我是theme的問題涨共,于是找Theme.AppCompat.Light.DarkActionBar,點擊進去看會看到
  • actionBarPopupThem是Light的闯狱,就是menu菜單點擊彈出那個
  • actionBarTheme是深色系的煞赢,那么控制按鈕圖標和主副標題顏色就是白色的
<style name="Base.Theme.AppCompat.Light.DarkActionBar" parent="Base.Theme.AppCompat.Light">
        <item name="actionBarPopupTheme">@style/ThemeOverlay.AppCompat.Light</item>
        <item name="actionBarWidgetTheme">@null</item>
        <item name="actionBarTheme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>

        <!-- Panel attributes -->
        <item name="listChoiceBackgroundIndicator">@drawable/abc_list_selector_holo_dark</item>

        <item name="colorPrimaryDark">@color/primary_dark_material_dark</item>
        <item name="colorPrimary">@color/primary_material_dark</item>
    </style>
4.2、新建Toolbar的theme和popuptheme:這里面就是繼承剛剛找到的東西哄孤,當然也可以再自定義顏色咯
    <!--給toolbar單獨設置的theme照筑,讓toolbar上按鈕顏和文字顏色變化的-->
    <style name="MyDarkToolBarTheme" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
        <!--toolbar圖標顏色-->
        <!--<item name="colorControlNormal">@color/colorAccent</item>-->
        <!--toolbar的title顏色-->
        <!--<item name="android:textColorPrimary">@color/colorAccent</item>-->
        <!--toolbar的subtitle顏色-->
        <!--<item name="subtitleTextColor">@color/colorAccent</item>-->
    </style>

    <!--給toolbar的menu內單獨設置的theme,讓toolbar上按鈕顏和文字顏色變化的-->
    <style name="MyLightPopupTheme" parent="ThemeOverlay.AppCompat.Light">
        <!--設置背景-->
        <!--<item name="android:background">@android:color/white</item>-->
        <!--設置字體顏色-->
        <!--<item name="android:textColor">@color/colorAccent</item>-->
        <!--設置不覆蓋錨點-->
        <!--<item name="overlapAnchor">false</item>-->
    </style>
4.3瘦陈、添加Toolbar的theme和popuptheme
//需添加
xmlns:app="http://schemas.android.com/apk/res-auto"

<!--這里是代替actionbar的凝危,當然可以設置在baseactivity中通用,然后include進來-->
    <android.support.v7.widget.Toolbar
        省略...
        app:theme="@style/MyDarkToolBarTheme"
        app:popupTheme="@style/MyLightPopupTheme">

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

大功告成

以上就是ActionBar和ToolBar的入門使用晨逝,后面配合上系統(tǒng)的StatusBar和NavigationBar蛾默,并實現(xiàn)沉浸式還有的煩,但這些都屬于基礎部分捉貌,得打牢UI基礎支鸡。

友情鏈接>>> Android 沉浸式風格(為毛叫沉浸式這么唬人)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市趁窃,隨后出現(xiàn)的幾起案子牧挣,更是在濱河造成了極大的恐慌,老刑警劉巖醒陆,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瀑构,死亡現(xiàn)場離奇詭異,居然都是意外死亡刨摩,警方通過查閱死者的電腦和手機寺晌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來澡刹,“玉大人呻征,你說我怎么就攤上這事“战剑” “怎么了怕犁?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長己莺。 經常有香客問我,道長戈轿,這世上最難降的妖魔是什么凌受? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮思杯,結果婚禮上胜蛉,老公的妹妹穿的比我還像新娘挠进。我一直安慰自己,他們只是感情好誊册,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布领突。 她就那樣靜靜地躺著,像睡著了一般案怯。 火紅的嫁衣襯著肌膚如雪君旦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天嘲碱,我揣著相機與錄音金砍,去河邊找鬼。 笑死麦锯,一個胖子當著我的面吹牛恕稠,可吹牛的內容都是我干的。 我是一名探鬼主播扶欣,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼鹅巍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了料祠?” 一聲冷哼從身側響起骆捧,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎术陶,沒想到半個月后凑懂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡梧宫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年接谨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塘匣。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡脓豪,死狀恐怖,靈堂內的尸體忽然破棺而出忌卤,到底是詐尸還是另有隱情扫夜,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布驰徊,位于F島的核電站笤闯,受9級特大地震影響,放射性物質發(fā)生泄漏棍厂。R本人自食惡果不足惜颗味,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望牺弹。 院中可真熱鬧浦马,春花似錦时呀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至磺陡,卻和暖如春趴梢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仅政。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工垢油, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人圆丹。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓滩愁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辫封。 傳聞我的和親對象是個殘疾皇子硝枉,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內容