Android 標題欄(二)
在前一篇文章Android標題欄(一)中我們已經講解了一些屬性,接下來我們繼續講解剩下的屬性。
ActionBar & Toolbar
設定ActionView
我們可以在選單中設定ActionView,比如搜尋,他是一個帶圖示和輸入框的控制元件,他分別有兩種不同的形態,展開和摺疊。接下來我們就講講怎麼設定ActionView。
1.在menu選單的item中設定actionViewClass屬性:
<item
android:id="@+id/search_icon"
android:icon="@drawable/actionbar_search_dark_icon"
android:title="@string/search"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="ifRoom|collapseActionView">
</item>
// 注意 根據是否引用的support包,actionViewClass設定的類不同,如果是support包則設定為android.support.v7.widget.SearchView且用app來標識, 否則設定為android.widget.SearchView且用android來標識
2:在程式碼中可以獲取到ActionView,也可以設定ActionView:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.action_menu, menu);
MenuItem search = menu.findItem(R.id.search_icon);
// 這種方式也可以獲取到ActionView
// SearchView view = (SearchView) search.getActionView();
// 一定要注意匯入的類是否正確,要區分support和非support包中的類
SearchView view = (SearchView) MenuItemCompat.getActionView(search);
view.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
return true;
}
如果menu選單中沒有設定actionViewClass,也可以在程式碼中手動設定,search.setActionView(new SearchView(this));
,上面就是獲取到的SearchView,一定要注意引入的類是否正確,否則會崩潰,拿到後就可以設定查詢等監聽了,這裡就不在演示了。
ActionView展開摺疊
我們可以對選單新增展開摺疊監聽,比如搜尋框
:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.action_menu, menu);
MenuItem search = menu.findItem(R.id.search_icon);
// support 包呼叫如下方法
MenuItemCompat.setOnActionExpandListener(search, new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
return false;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
return false;
}
});
//
// search.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
// @Override
// public boolean onMenuItemActionExpand(MenuItem item) {
// // TODO
// return true;
// }
//
// @Override
// public boolean onMenuItemActionCollapse(MenuItem item) {
// // TODO
// return true;
// }
// });
return true;
}
返回true表示應該被展開或者摺疊,返回false表示不應該被展開或者摺疊,處理邏輯都在兩個回撥中。
新增ActionProvider
1.在menu選單中新增app:actionProviderClass屬性:
<item
android:id="@+id/plus"
android:icon="@drawable/actionbar_plus_icon_normal"
android:title="@string/more"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"
app:showAsAction="always">
</item>
// 注意 根據是否引用的support包,actionProviderClass設定的類不同,如果是support包則設定為android.support.v7.widget.ShareActionProvider且用app來標識, 否則設定為android.widget.ShareActionProvider且用android來標識
2. 在程式碼中設定
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.action_menu, menu);
MenuItem plus = menu.findItem(R.id.plus);
//support包中採用如下方法
//MenuItemCompat.setActionProvider(plus, new ShareActionProvider(this));
//非support中直接設定
//plus.setActionProvider(new ShareActionProvider(this));
//support包中採用如下方法
ShareActionProvider provider = (ShareActionProvider) MenuItemCompat.getActionProvider(plus);
provider.setShareIntent(getShareIntent());
//ShareActionProvider provider = plus.getActionProvider();
return true;
}
private Intent getShareIntent() {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/*");
return intent;
}
上述就實現了分享的效果,只是需要注意的是要區分所引用的類是否是support包中的類。型別一定要正確。
自定義provider
如果系統提供的provider不符合要求怎麼辦?我們還可以自定義provider。
public class PlusProvider extends ActionProvider {
/**
* Creates a new instance. ActionProvider classes should always implement a
* constructor that takes a single Context parameter for inflating from menu XML.
*
* @param context Context for accessing resources.
*/
public PlusProvider(Context context) {
super(context);
}
@Override
public void onPrepareSubMenu(SubMenu subMenu) {
subMenu.clear();
subMenu.add("tab1").setIcon(R.drawable.logo).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
return false;
}
});
subMenu.add("tab2").setIcon(R.drawable.logo).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
return false;
}
});
}
@Override
public View onCreateActionView() {
return null;
}
@Override
public boolean hasSubMenu() {
return true;
}
}
上面我們自定義了一個加號的provider,hasSubMenu表示十分有子選單,true表示有,在onPrepareSubMenu中初始化子選單。子選單可以設定顯示文字,圖示與響應點選事件。
設定完成後,就與系統提供的provider使用方式一樣。
設定ActionLayout
設定ActionLayout可以用自定義的佈局來展示選單圖示。
1.建立一個佈局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="right"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.netease.study.ui.title.ActionBarActivity">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/actionbar_setting_icon"/>
</RelativeLayout>
佈局中包含了一個設定圖示,之後在menu中引用
<item
android:id="@+id/plus"
android:icon="@drawable/actionbar_plus_icon_normal"
android:title="@string/more"
app:actionLayout="@layout/action_layout"
app:showAsAction="always">
</item>
這樣就把預設的加號圖示給改變成設定圖示,在程式碼中也可以呼叫setActionView來更改圖示。但是不建議這樣做,每一個選單都做明確的事情。
頁面導航
怎麼開啟頁面導航?在程式碼中呼叫getActionBar(). setDisplayHomeAsUpEnabled(true)就可以開啟頁面導航,如果是support包中需要呼叫getSupportActionBar(),開啟後,預設頁面左上角會出現返回箭頭。指示頁面點選可以返回。僅僅是開啟頁面導航是不夠的,還需要對他進行處理。
因為返回箭頭也屬於ActionBar中的ActionView因此處理方式是一樣的,不同是的它的id已經預設指定為android.R.id.home。因此需要在onOptionsItemSelected函式中處理id為android.R.id.home:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
break;
}
return super.onOptionsItemSelected(item);
}
左上的箭頭圖示,我們可以在style中設定為自己的圖示,也可以在程式碼中呼叫getActionBar().setHomeAsUpIndicator()來更改圖示。
一般情況下只需要關閉掉當前介面,因此直接呼叫finish關閉掉當前頁面。但是這不是返回箭頭設定的初衷,否則他與軟體的返回沒有任何的區別,那在什麼情況下需要特殊處理吶?
我們先來看看一個官方的圖片:
這裡有一個郵件列表頁面,點選其中一項,開啟郵件詳情,在郵件詳情頁可以左右導航到上一封或者下一封郵件,這樣在點選左上箭頭事希望能回到列表頁,而軟鍵盤返回則返回上一個頁面。這種情況怎麼處理?
1.首先需要在AndroidManifest頁面中對Activity設定parent屬性:
// 4.1版本之前
<activity
android:name=".ActionBarActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity">
</meta-data>
</activity>
// 4.1版本之後
<activity
android:name=".ActionBarActivity"
android:parentActivityName=".MainActivity">
</activity>
2:在程式碼中處理對應的邏輯:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
Intent intent = NavUtils.getParentActivityIntent(this);
if(intent!=null){
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
NavUtils.navigateUpTo(this, intent);
}else{
finish();
}
break;
}
return super.onOptionsItemSelected(item);
}
這樣就可以直接放回到列表頁,不在返回上一個介面,與返回鍵處理是不同的。
設定ActionMode
ActionMode是一種選單,但是與其他選單不一樣的是,他佔據的位置預設為ActionBar的位置,使用方式如下:
private void findViews() {
View actionMode = findViewById(R.id.show_menu);
assert actionMode != null;
actionMode.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
ActionBarActivity.this.startActionMode(callback);
return true;
}
});
}
private ActionMode.Callback callback = new ActionMode.Callback() {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.action_menu1, menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
}
};
我在對一個view進行長按的時候,出現ActionMode選單。
長按前:
長按後:
Toolbar
如果Toolbar不當做ActionBar處理,Toolbar怎麼進行設定與選單顯示?
private void setToolbar(Toolbar toolbar) {
//setSupportActionBar(toolbar);
toolbar.setTitle("主標題");
toolbar.setSubtitle("副標題");
toolbar.setLogo(R.drawable.logo);
toolbar.inflateMenu(R.menu.action_menu);
toolbar.setOnMenuItemClickListener(new toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
return false;
}
});
}
上面演示了當不做為ActionBar時,Toolbar怎麼進行設定,主要是選單的載入方式變化。Toolbar還可以與CollapsingToolbarLayout,AppBarLayout實現不一樣的標題效果。
總結
這裡主要是對ActionBar和Toolbar的使用進行了梳理,其實還有怎麼對他們進行主題配置,這裡就不在展開了。
相關推薦
Android 標題欄(二)
在前一篇文章Android標題欄(一)中我們已經講解了一些屬性,接下來我們繼續講解剩下的屬性。 ActionBar & Toolbar 設定ActionView 我們可以在選單中設定ActionView,比如搜尋
Android 標題欄(1)
本文來自網易雲社群作者:孫有軍標題欄在每個應用中都有,有各種各樣的標題欄,今天我們就主要來說說標題欄怎麼做,主要內容涉及到自定義標題,ActionBar,Toolbar等知識。自定義標題幾年前開發安卓是沒有統一的標題的,每一個頁面都需要自己來佈局標題,如果有多個頁面標題類似,
android介面設計(二)側邊欄的兩種實現方式
dome:https://github.com/linliangliang/sidebar 一、使用sideingMenu結合fragment實現。 二、使用NavigationView和DrawerLayout實現。 第一種實現方式:https://mp.csdn.net/posted
Android 之修改標題欄(title)
1、首先匯入ActionBarActivity包,然後將MainActivity繼承Activity而不是ActionBarActivity(注意這裡只改變的了主介面的標題) import android.support.v7.app.ActionBarActivity;
android事件分發(二)
sim tdi p s oat front rac ram addclass framework 非常早之前寫過一篇android事件分發的博客,主要寫的是它是怎樣分發的,具體非常多原理的東西都沒有涉及到。今天就從源代碼看android怎樣控制它的分發機
Android之Intent(二)
Android Intent 前一篇(Android之Intent(一))講解過A(它用來調起B界面,這裏先理解為父界面) 可以向B(這裏先理解為子界面), 本篇正好是一個逆反的過程 , 即B向A傳遞數據。 一 : 界面設計① ,A(activity_main.xml)重要控件:1‘ (TextVie
Android NDK學習(二):編譯腳本語法Android.mk和Application.mk
GC make files 文件的 包括 一次 opengl aries 基本語法 一、Android.mk Android.mk分為一下幾部分: LOCAL_PATH:= $(call my-dir), 返回當前文件在系統中的路徑,Android.mk文件開始時必須定義
Android Camera2 拍照(二)——使用TextureView
wid metadata TE 遍歷 接口 post eating connected edit 原文:Android Camera2 拍照(二)——使用TextureView
Android 開發:(二)安卓常用5大布局方式
一、Android中常用的5大布局方式有以下幾種: 1.線性佈局(LinearLayout):按照垂直或者水平方向佈局的元件; 2.幀佈局(FrameLayout) :元件從螢幕左上方(0,0)佈局元件; 3.相對佈局 (RelativeLayout) :相對其它元件的佈
Android輸入系統(二)IMS的啟動過程和輸入事件的處理
本文首發於 劉望舒的部落格 地址:liuwangshu.cn/framework/i… 關聯絡列 解析WMS系列 深入理解JNI系列 輸入系統系列 前言 在上一篇文章中,我們學習了IMS的誕生(建立),IMS建立後還會進行啟動,這篇文章我們來學習IMS的啟動過程和輸入事件的處理。 1.IMS
android之animation(二)animationset、interpolator
一: animationset: 他是一個animation的一個子類,實際上是animation的一個集合。他將animation放到一個list集合中。需要對animation的基本設定可以通過animationset來設定。如果需要對一個控制元件進行多種動畫設定,可以採用animat
Android學習心得(二)
Android儲存方式 儲存偏好設定 持久化資料:使應用程式執行時需要長期儲存一些資料。 SharePreferences物件、檔案和 SQLite資料庫來儲存這些持久化資料 存取活動的偏好設定 SharePreferences類屬於Android.cntent
android 之動畫 (二) 插值器
插值器 首先要了解為什麼需要插值器,因為在補間動畫中,我們一般只定義關鍵幀(首幀或尾幀),然後由系統自動生成中間幀,生成中間幀的這個過程可以成為“插值”。插值器定義了動畫變化的速率,提供不同的函式定義變化值相對於時間的變化規則,可以定義各種各樣的非線性變化函式,比如加速、減速等。下面是幾種常
Android進階(二): 應用程序啟動過程
1.前言 最近一直在看 《Android進階解密》 的一本書,這本書編寫邏輯、流程都非常好,而且很容易看懂,非常推薦大家去看看(沒有收廣告費,單純覺得作者寫的很好)。 今天就將 應用程序啟動過程 總結一下(基於Android 8.0 系統)。 文章中例項&nbs
每日一記—獲取Bing每一日一圖實現Android歡迎頁(二)
日期2018.9.12 第二部分:獲取bing每日一圖 通過訪問 http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=5&mkt=zh-CN 可以得到一組json資料,如下:
egret 釋出android原生專案(二)執行專案
一、編譯Demo專案 在終端定位到Demo目錄,執行如下命令 egret build -e (-e 編譯指定專案的同時編譯引擎目錄) 在瀏覽器訪問http://10.0.0.237/demo/index.html(10.0.0.237為本地ip地址) 二、Androi
Android學習筆記(二)
1.Android的APK瘦身方法 在這裡給大家推薦一個網站,關於圖片線上壓縮的TinyPNG,然後使用android studio自帶工具Lint剔除無用資源(res資原始檔),如果你閒的話那就再手
Android開發筆記(二)顏色的使用
顏色的編碼 Android中顏色值的定義是由透明度alpha和RGB(紅綠藍)三原色來定義的,有八位十六進位制數與六位十六進位制數兩種編碼,例如八位FFE
床頭筆記之Android開發學習(二)
安卓Android開發環境搭建 之前用Android studio環境搭建,發現因為初學不熟,後面裝的東西太多了,電腦本身就卡,被我直接全卸了,打算用另一種簡單用得比較多的環境先入手。 本次用Eclipse、JDK、Android SDK、ADT外掛、安卓模擬器
android記錄筆記(二)針對應用框架層梳理的整合筆記
這篇筆記主要是結合自我認知,加上各種學習資源,整理而成的查詢筆記,整理的不好,還望指出錯誤,主要是用於查詢與記錄,該篇筆記大多借鑑劉望舒的部落格,對大佬致敬哈,我也是你忠實的粉絲,如有冒犯,請見諒,我將立即刪除本篇文章。 針對應用框架層我認為必須要清楚的知識概念: 第一: