效果圖(1.3M)

一、前言
** 戳這里可以去DEMO,來(lái)吧 **
相信剛接觸android不久的同志們,在面對(duì)產(chǎn)品提出的 :
“自定義WebView頁(yè)面中,長(zhǎng)按文本的彈出選項(xiàng)、點(diǎn)擊選擇后,分享、轉(zhuǎn)發(fā)、收藏選擇文本”
這樣的需求時(shí),第一反應(yīng)大部分是:這是系統(tǒng)行為,如果實(shí)現(xiàn)需要在web端實(shí)現(xiàn)。
但是web端實(shí)現(xiàn)的局限性太大,曾經(jīng)也有過(guò)監(jiān)聽(tīng)系統(tǒng)粘貼板,在用戶點(diǎn)擊復(fù)制的時(shí)候?qū)崿F(xiàn)其他的邏輯,但是這樣用戶體驗(yàn)不好,所以自定義WebView中長(zhǎng)按的彈出菜單,并在點(diǎn)擊時(shí)返回選中文本的小控件閃亮登場(chǎng)┏ (^ω^)=。
二、自定義長(zhǎng)按彈出菜單
這一步實(shí)現(xiàn)其實(shí)很簡(jiǎn)單,首先創(chuàng)建一個(gè)CustomActionWebView繼承系統(tǒng)WebView,然后重寫下面兩個(gè)方法。
這兩個(gè)方法會(huì)在用戶長(zhǎng)按選擇web文本時(shí),在彈出菜單前被調(diào)用。它們之間的區(qū)別在于,第一個(gè)方法的菜單彈出方式,指定了默認(rèn)的type。我們并不關(guān)心彈出的item類型是什么,我們只需要攔截下來(lái)ActionMode,然后返回我們自己的自定義ActionMode即可。
@Overridepublic ActionMode startActionMode(ActionMode.Callback callback) { ActionMode actionMode = super.startActionMode(callback); return resolveActionMode(actionMode);}@Overridepublic ActionMode startActionMode(ActionMode.Callback callback, int type) ActionMode actionMode = super.startActionMode(callback, type); return resolveActionMode(actionMode);}這里我們所做的事是:
1、把原本的actionMode對(duì)象保存到mActionMode中。
2、清空原本actionMode中的MenuItem。
3、添加我們自定義的item到actionMode中。
4、重定義每個(gè)menuItem的點(diǎn)擊事件。
5、在點(diǎn)擊事件中通過(guò)執(zhí)行js,獲取選中文本。
6、通過(guò)上面保存的 mActionMode,釋放彈出菜單(不釋放會(huì)內(nèi)存泄漏)。
7、返回新填充的actionMode給系統(tǒng)。
/** * 處理item,處理點(diǎn)擊 * @param actionMode */private ActionMode resolveActionMode(ActionMode actionMode) { if (actionMode != null) { final Menu menu = actionMode.getMenu(); mActionMode = actionMode; menu.clear(); for (int i = 0; i < mActionList.size(); i++) { menu.add(mActionList.get(i)); } for (int i = 0; i < menu.size(); i++) { MenuItem menuItem = menu.getItem(i); menuItem.setOnMenuItemClickListener(new Item.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { getSelectedData((String) item.getTitle()); releaseAction(); return true; } }); } } mActionMode = actionMode; return actionMode;}實(shí)現(xiàn)效果

三、獲取選中文本
光自定義菜單,拿不到選中文本也沒(méi)意義,那么如何獲取選中文本呢?這里如果不轉(zhuǎn)個(gè)彎,還真會(huì)在南墻在撞死( ̄^ ̄) 主站蜘蛛池模板: 嵊泗县| 临朐县| 巴南区| 同江市| 洛宁县| 德昌县| 株洲市| 镇坪县| 遵义县| 乐都县| 房产| 陇川县| 德江县| 太湖县| 南丰县| 玉环县| 米脂县| 大庆市| 综艺| 崇文区| 黄平县| 卓尼县| 乐陵市| 寻乌县| 贵港市| 元氏县| 明星| 惠水县| 宁德市| 平遥县| 富宁县| 天长市| 汉阴县| 通化县| 新津县| 昔阳县| 探索| 赤城县| 江津市| 昌黎县| 荥经县|