一、android中的ActionBar和ToolBar
二、『Material Design入門學習筆記』主題與AppCompatActivity(附demo)
三、Android開發:最詳細的 Toolbar 開發實踐總結
四、Toolbar設置詳解----掉坑總結html
自android5.0開始,AppCompatActivity代替ActionBarActivity,並且ToolBar也代替了ActionBar,下面就是ActionBar和ToolBar的使用android
image.pngapp
2.一、AppCompatActivity和其對應的Themeide
//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.二、ActionBar的使用函數
//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");
//左側按鈕:可見+可用+更換圖標 actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeButtonEnabled(true); //actionBar.setHomeAsUpIndicator(R.mipmap.back_white);
/** * 複寫:左側按鈕點擊動做 * 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 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);
/** * 複寫:添加菜單佈局 * */ @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu, menu); return true; } /** * 複寫:設置菜單監聽 * */ @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; }
//增長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);
case R.id.btn_hide: if(actionBar != null){ /** * 隱藏actionbar * 一、有actionbar狀況下:actionBar.hide(); * 二、直接使用Theme.Holo.NoActionBar * 三、theme中添加屬性 * <item name="windowActionBar">false</item> * <item name="windowNoTitle">true</item> * 四、在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;
-------------------------------------分割線-------------------------------佈局
<?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:同種類菜單的排列順序。該屬性須要設置一個整數值--> <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>
-------------------------------------分割線-------------------------------學習
瞭解了ActionBar的話,那麼ToolBar和其差很少,更增強大,更加符合MD風格,而後就代替ActionBar,使用起來差很少,可是又UI上的坑字體
image.pngthis
2.一、隱藏ActionBar有4中方式spa
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的使用
<!--這裏是代替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>
//隱藏默認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");
//左側按鈕:可見+更換圖標+點擊監聽 getSupportActionBar().setDisplayHomeAsUpEnabled(true);//顯示toolbar的返回按鈕 //toolBar.setNavigationIcon(R.mipmap.back_white); toolBar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } });
//設置logo toolBar.setLogo(android.R.mipmap.sym_def_app_icon);
/** * 複寫:添加菜單佈局 * */ @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu, menu); return true; } /** * 複寫:設置菜單監聽 * */ @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; }
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;
4.一、ToolBar顯然顏色不對,那找找爲啥ActionBar的時候對的,直覺告訴我是theme的問題,因而找Theme.AppCompat.Light.DarkActionBar,點擊進去看會看到
<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.二、新建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.三、添加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的入門使用,後面配合上系統的StatusBar和NavigationBar,並實現沉浸式還有的煩,但這些都屬於基礎部分,得打牢UI基礎。
友情連接>>> Android 沉浸式風格(爲毛叫沉浸式這麼唬人)
做者:Kandy_JS 連接:https://www.jianshu.com/p/81d0bcb282cb 來源:簡書 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。