參考
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舅锄、截圖
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:
//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(),
/**
* 復寫:左側按鈕點擊動作
* 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、截圖:顏色不正常的
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中布局代碼:
<!--這里是代替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 沉浸式風格(為毛叫沉浸式這么唬人)