Android修改6.0系統(tǒng)文本選擇菜單

因?yàn)槲疑砘剂餍行越^癥(拖延癥),不知不覺(jué)中博客已經(jīng)有半年沒(méi)更新了 ( ⊙ o ⊙ )劲装。

正好最近在寫(xiě)文本選擇菜單的功能染突,就整理出了一篇文章啊终,算是我與該死的拖延癥展開(kāi)的殊死搏斗吧。

本文主要寫(xiě)了在Android6.0+版本上甫匹,修改EditText甸鸟、TextView的文本選擇菜單內(nèi)容和為其他APP提供自定義文本操作這兩個(gè)功能。

1.修改EditText和TextView的文本選擇菜單內(nèi)容

Android官方控件中赛惩,EditText中的文字默認(rèn)長(zhǎng)按呼出文本選擇菜單哀墓,而TextView需要設(shè)置android:textIsSelectable="true"。

我們修改文本選擇菜單內(nèi)容喷兼,只需要為TextView或者EditText設(shè)置setCustomSelectionActionModeCallback()方法篮绰,并且在方法里實(shí)現(xiàn)ActionMode.Callback()或ActionMode.Callback2()接口。

ActionMode.Callback()和ActionMode.Callback2()接口的主要內(nèi)容相同季惯,只是Callback2中多了一個(gè)onGetContentRect()方法吠各,重寫(xiě)可以改變彈出菜單的位置。另外勉抓,Callback2需要判斷sdk23及以上版本贾漏,Callback()不用,但是在6.0以下系統(tǒng)中實(shí)際是無(wú)效的藕筋。

我們先在res下的menu文件夾里新建一個(gè)菜單文件纵散,我把它命名為selection_action_menu.xml,內(nèi)容如下

    <?xml version="1.0" encoding="utf-8"?>
    <menu
 xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/Informal22"
        android:title="自定義22" />
    <item
        android:id="@+id/Informal33"
        android:title="自定義33" />
 </menu>

然后我們完成文本選擇菜單的修改

    ActionMode.Callback2 textSelectionActionModeCallback;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
        textSelectionActionModeCallback = new ActionMode.Callback2() {
            @Override
            public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
                MenuInflater menuInflater = actionMode.getMenuInflater();
                menuInflater.inflate(R.menu.selection_action_menu,menu);
                return true;//返回false則不會(huì)顯示彈窗
            }

            @Override
            public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
                return false;
            }

            @Override
            public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
                //根據(jù)item的ID處理點(diǎn)擊事件
                switch (menuItem.getItemId()){
                    case R.id.Informal22:
                        Toast.makeText(MainActivity.this, "點(diǎn)擊的是22", Toast.LENGTH_SHORT).show();
                        actionMode.finish();//收起操作菜單
                        break;
                    case R.id.Informal33:
                        Toast.makeText(MainActivity.this, "點(diǎn)擊的是33", Toast.LENGTH_SHORT).show();
                        actionMode.finish();
                        break;
                }
                return false;//返回true則系統(tǒng)的"復(fù)制"隐圾、"搜索"之類的item將無(wú)效伍掀,只有自定義item有響應(yīng)
            }

            @Override
            public void onDestroyActionMode(ActionMode actionMode) {

            }

            @Override
            public void onGetContentRect(ActionMode mode, View view, Rect outRect) {
                //可選  用于改變彈出菜單的位置
                super.onGetContentRect(mode, view, outRect);
            }
        };
    }
增加自定義item
增加自定義item

上面這樣寫(xiě)的話會(huì)有系統(tǒng)的“復(fù)制”、“全選”暇藏、“搜索”等item蜜笤,以及其他APP提供的操作item,如果你(或者你們產(chǎn)品經(jīng)理)傲嬌的想要屏蔽所有非本APP自定義item盐碱,可以改成這樣

  @Override
  public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
        return true;//返回false則不會(huì)顯示彈窗
  }

  @Override
  public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
         MenuInflater menuInflater = actionMode.getMenuInflater();
         menu.clear();
         menuInflater.inflate(R.menu.selection_action_menu,menu);
         return true;
  }
只有自定義item

然后我們?yōu)門extView和EditText設(shè)置文本選擇操作回調(diào)

  textView.setCustomSelectionActionModeCallback(textSelectionActionModeCallback);
  editText.setCustomSelectionActionModeCallback(textSelectionActionModeCallback);

EditText在還有一個(gè)插入操作菜單可以設(shè)置

  edittext.setCustomInsertionActionModeCallback(textSelectionActionModeCallback);
EditText插入操作菜單

MIUI上小米重寫(xiě)了EditText和TextView中的文本選擇菜單把兔,上面這些代碼修改無(wú)效沪伙。好吧,算你狠县好。 = =围橡、

2.為其他APP提供文本選擇操作

一般剪切板、翻譯聘惦、搜索某饰、記事本類APP會(huì)提供這種功能,為用戶提供便捷操作善绎,同時(shí)也刷下自己的存在感黔漂。

我先建了一個(gè)繼承自Activity的CustomTextProcessingActivity,簡(jiǎn)單寫(xiě)了下布局禀酱,我這因?yàn)橥涎影Y的常見(jiàn)并發(fā)癥——懶癌發(fā)作炬守,代碼就不貼出來(lái)了。

然后按照基本法到清單文件里去注冊(cè)一下

<activity android:name=".CustomTextProcessingActivity">
    <intent-filter>
        <action android:name="android.intent.action.PROCESS_TEXT"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
</activity>

這里可以為activity自定義主題和標(biāo)簽剂跟,標(biāo)簽值就是文本選擇操作菜單中出現(xiàn)的item名减途。默認(rèn)就是APP名稱"MY APPLICATION"。如果你想讓這個(gè)操作只出現(xiàn)在本APP中曹洽,可以設(shè)置android:exported=”false”鳍置。

回到CustomTextProcessingActivity中,獲取用戶選擇的文本只需要這樣

 CharSequence text = getIntent().getCharSequenceExtra(Intent.EXTRA_PROCESS_TEXT);

我們還可以判斷文本是否可編輯

 boolean isReadonly = getIntent().getBooleanExtra(Intent.EXTRA_PROCESS_TEXT_READONLY, false);

我們點(diǎn)擊“MY APPLICATION”的時(shí)候送淆,其實(shí)系統(tǒng)是通過(guò)是 startActivityForResult()?來(lái)啟動(dòng)的CustomTextProcessingActivity税产,所以我們可以返回一個(gè)文本。當(dāng)選中的文本可編輯時(shí)(如EditText中的文字)偷崩,系統(tǒng)會(huì)替換文字辟拷;不可編輯時(shí),系統(tǒng)會(huì)通過(guò)toast的方式展示出來(lái)阐斜。

   //返回一個(gè)文本
   Intent intent = new Intent();
   intent.putExtra(Intent.EXTRA_PROCESS_TEXT, "這是替換的文字");
   setResult(RESULT_OK, intent);

這個(gè)界面寫(xiě)成彈窗的樣式感覺(jué)更好衫冻,看大家的具體設(shè)計(jì)了。

在我一加的氫OS上谒出,EditText在setCustomSelectionActionModeCallback()之后就只有第一部分中自定義的item以及系統(tǒng)的“復(fù)制”等基礎(chǔ)item隅俘,本APP和其他的三方APP提供的操作item都無(wú)法顯示。華為上是不顯示第二部分中APP提供的操作item,其他的正常顯示笤喳。而一加和華為上的TextView都是正常的为居。

至于小米,EditText和TextView不會(huì)顯示三方APP提供的操作item莉测。但是WebView中選擇文字彈出來(lái)的還是原生文本選擇操作菜單,有三方APP的操作item唧喉,估計(jì)是小米程序猿漏掉了捣卤。


這篇文章周末就開(kāi)始寫(xiě)了忍抽,現(xiàn)在的時(shí)間是周三。嗯...還行董朝,拖得時(shí)間不算太長(zhǎng)...

歡迎拖延癥病友交流病情鸠项。。子姜。祟绊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市哥捕,隨后出現(xiàn)的幾起案子牧抽,更是在濱河造成了極大的恐慌,老刑警劉巖遥赚,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扬舒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡凫佛,警方通過(guò)查閱死者的電腦和手機(jī)讲坎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)愧薛,“玉大人晨炕,你說(shuō)我怎么就攤上這事『谅” “怎么了瓮栗?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)碘箍。 經(jīng)常有香客問(wèn)我遵馆,道長(zhǎng),這世上最難降的妖魔是什么丰榴? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任货邓,我火速辦了婚禮,結(jié)果婚禮上四濒,老公的妹妹穿的比我還像新娘换况。我一直安慰自己,他們只是感情好盗蟆,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布戈二。 她就那樣靜靜地躺著,像睡著了一般喳资。 火紅的嫁衣襯著肌膚如雪觉吭。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天仆邓,我揣著相機(jī)與錄音鲜滩,去河邊找鬼伴鳖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛徙硅,可吹牛的內(nèi)容都是我干的榜聂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼嗓蘑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼须肆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起桩皿,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤豌汇,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后业簿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體瘤礁,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年梅尤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了柜思。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡巷燥,死狀恐怖赡盘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情缰揪,我是刑警寧澤陨享,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站钝腺,受9級(jí)特大地震影響抛姑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜艳狐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一定硝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧毫目,春花似錦蔬啡、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至刮便,卻和暖如春空猜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工辈毯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留久信,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓漓摩,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親入客。 傳聞我的和親對(duì)象是個(gè)殘疾皇子管毙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評(píng)論 25 707
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 46,708評(píng)論 22 664
  • 今天是妹妹的生日,媽媽買了一個(gè)蛋糕桌硫。 牛哥哥和姐姐圍在哪 大家伙開(kāi)開(kāi)心心一起唱生日歌 一個(gè)三磅的蛋糕夭咬,沒(méi)幾分鐘就就...
    冰雪中盛開(kāi)的花閱讀 262評(píng)論 0 0
  • 晨曦的第一杯水,排出毒素铆隘,你差青汁卓舵。 餐后的第一杯水,養(yǎng)護(hù)腸胃膀钠,你差青汁掏湾。 午后的第一杯水,清醒頭腦肿嘲,你差青汁融击。 ...
    小蝸先生閱讀 240評(píng)論 0 1
  • 1.RxSwift常見(jiàn)操作 never never就是創(chuàng)建一個(gè)sequence,但是不發(fā)出任何事件信號(hào)雳窟。 empt...
    CoderLWG閱讀 557評(píng)論 0 2