ActionMode簡介
ActionMode是android3.0之后出現的一種菜單選擇模式
ActionMode的創建
ActionMode的使用特別的簡單,主要用到兩個方法,startActionMode和ActionMode.Callback(),startActionMode:開啟我們的菜單,ActionMode.Callback方法中主要有四個方法,詳情和介紹看下面的代碼:
ActionMode.Callback mCallback=new ActionMode.Callback(){/*** 創建菜單的樣式,返回true說明創建成功* @param actionMode* @param menu* @return*/@Overridepublic boolean onCreateActionMode(ActionMode actionMode, Menu menu) {MenuInflater menuInflater = actionMode.getMenuInflater();menuInflater.inflate(R.menu.action_mode,menu);return true;}@Overridepublic boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {return false;}/*** 當ActionMode的條目被點擊的時候,調用這個方法* @param actionMode* @param menuItem* @return*/@Overridepublic boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {return false;}/*** 當ActionMode被銷毀的時候調用* @param actionMode*/@Overridepublic void onDestroyActionMode(ActionMode actionMode) {if(actionMode!=null){actionMode.finish();}}};
?
然后
?
通過startActionMode(mCallback);方法調用就可以了,就是這么簡單
ActionMode遇到的坑
當ActionMode和ToolBar一塊使用的時候,心情就不是那么的愉快了...,我們會看到下面的效果
Toolbar被擠壓下去了,是不是感覺安卓太坑了...
?
不用著急,我們還是有解決辦法滴,我們要確保幾件事情:
(1)我們的Activity繼承AppCompatActivity
(2)設置主題,保證我們的ActionMode顯示在Toolbar上面
<item name="windowActionModeOverlay">true</item>
此外我們可以在主題當中設置我們的ActionMode的樣式(高度,背景顏色,logo等)
<style name="actionModeStyle" ><!--設置AcitonMode的背景顏色--><item name="background">@color/color_999999</item><item name="backgroundSplit">?attr/actionModeSplitBackground</item><!--設置ActionMode的高度--><item name="height">64dp</item><item name="titleTextStyle">@style/TextAppearance.AppCompat.Widget.ActionMode.Title</item><item name="subtitleTextStyle">@style/TextAppearance.AppCompat.Widget.ActionMode.Subtitle</item><!--設置ActionMode的左邊圖標--><item name="closeItemLayout">@layout/abc_action_mode_close_item_material</item></style>
WebView中的ActionMode(實現長按復制文本的功能)
ActionMode在webview上面,Android6.0之前和之后發生了一些變化,6.0之后的更加友好
Android6.0之前的樣式就是我們上圖那幅圖片所展示的
?
實現自定義ActionMode
繼承WebView,重寫startActionMode方法,攔截我們的ActionMode對象,然后對此進行一些處理就可以了,直接上代碼
@Overridepublic ActionMode startActionMode(ActionMode.Callback callback) {ActionMode actionMode = super.startActionMode(callback);return resolveMode(actionMode);}@Overridepublic ActionMode startActionMode(ActionMode.Callback callback, int type) {ActionMode actionMode = super.startActionMode(callback, type);return resolveMode(actionMode);}public ActionMode resolveMode(ActionMode actionMode) {if(actionMode!=null){final Menu menu = actionMode.getMenu();menu.clear();for (int i = 0; i < title.length; i++) {menu.add(title[i]);}for (int i = 0; i < title.length; i++) {MenuItem item = menu.getItem(i);item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {@Overridepublic boolean onMenuItemClick(MenuItem menuItem) {String title = menuItem.getTitle().toString();getSelectedData(title); //獲取選中的h5頁面的文本releaseActionMode();return true;}});}this.mActionMode = actionMode;}return actionMode;}
當點擊ActionMode的item的之后,將我們的actionMode finish掉
public void releaseActionMode() {if (mActionMode != null) {mActionMode.finish();mActionMode = null;}}
獲取h5頁面的文本信息
獲取h5頁面的文本信息,需要使用到js方法來幫助我們實現這些功能,然后在通過js和java交互回傳我們的文本內容(js和java如何交互,這里就不多說了......)
/*** 點擊的時候,獲取網頁中選擇的文本,回掉到原生中的js接口* @param title 傳入點擊的item文本,一起通過js返回給原生接口*/private void getSelectedData(String title) {String js = "(function getSelectedText() {" +"var txt;" +"var title = \"" + title + "\";" +"if (window.getSelection) {" +"txt = window.getSelection().toString();" +"} else if (window.document.getSelection) {" +"txt = window.document.getSelection().toString();" +"} else if (window.document.selection) {" +"txt = window.document.selection.createRange().text;" +"}" +"ActionModeJavaScript.callback(txt,title);" + //回調java方法將js獲取的結果傳遞過去"})()";if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //android系統4.4以上的時候調用js方法用這個evaluateJavascript("javascript:" + js, null);} else {loadUrl("javascript:" + js);}}
源碼
參考文章:
?
http://blog.csdn.net/evan_man/article/details/51685022
http://blog.csdn.net/u012336923/article/details/50865120#%E6%80%BB%E7%BB%93
https://stackoverflow.com/questions/26483778/display-actionmode-over-toolbar
?
---------------------
作者:彼岸人生
來源:CSDN
原文:https://blog.csdn.net/kemeng7758/article/details/77869113?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!?