Android沉浸式與SearchView的坑

轉(zhuǎn)載注明出處:簡書-十個雨點

Android開發(fā)雖然不算多難,但其中確實包含了這樣那樣的坑狐蜕,我今天要說的這個坑可能很少人會遇到宠纯,不過萬一呢。层释。婆瓜。

一開始是我想在項目的toolbar上添加谷歌原生支持的搜索功能,但是怎么弄都不對贡羔,鍵盤彈出以后搜索框會自動消失廉白,如下圖所示,可能比較亂乖寒,將就看看吧:

鍵盤彈出后搜索框會自動消失

經(jīng)過兩天的不斷修改嘗試猴蹂,終于找到了癥結(jié)所在:

在styles.xml文件中設(shè)置windowTranslucentStatus=true會導(dǎo)致SearchView顯示不正確!

同時還得到一個結(jié)論:

targetSdkVersion對最終編譯結(jié)果有較大的影響楣嘁!

先說targetSdkVersion對最終編譯結(jié)果的影響磅轻,這些影響主要在support庫的界面上。比如同樣使用Theme.AppCompat.Light.NoActionBar逐虚,targetSdkVersion<21編譯的結(jié)果運(yùn)行在api21以上的手機(jī)上聋溜,就不自帶沉浸式狀態(tài)欄。而targetSdkVersion>=21編譯的就自帶沉浸式狀態(tài)欄痊班,不過api19的還是需要使用windowTranslucentStatus來開啟沉浸式狀態(tài)欄的勤婚。

再比如跟上例一樣的targetSdkVersion設(shè)置摹量,用同樣的NotificationCompat生成的通知的顯示效果是不一樣的涤伐,如下圖:

targetSdkVersion<21編譯的結(jié)果
targetSdkVersion>=21編譯的結(jié)果

甚至還有更可怕的馒胆,是會影響到一些奇怪的地方,比如友盟的反饋組件界面:

targetSdkVersion=15編譯的結(jié)果

targetSdkVersion>=19編譯的結(jié)果

我知道一般人是看不出差別來的凝果,那么看下面這個圖:


仔細(xì)看看差別

這下看得出來了吧祝迂,完全影響到界面布局了,而且語音按鈕的點擊功能也失效了F骶弧P亡ā!

所以為了保證友盟的反饋組件的可用性山害,我只能現(xiàn)在targetSdkVersion=15了纠俭。

具體的原因還不太清楚,可能是我自己本身哪里使用得不太對吧浪慌。冤荆。。

再說回到windowTranslucentStatus权纤。

為什么要設(shè)置windowTranslucentStatus呢钓简?windowTranslucentStatus顧名思義是透明狀態(tài)欄的意思,參照前面所說的汹想,如果targetSdkVersion<21外邓,如果要實現(xiàn)沉浸式的效果,就需要設(shè)置windowTranslucentStatus古掏,或者如果想要api19也實現(xiàn)沉浸式效果损话,無論targetSdkVersion為多少都要設(shè)置windowTranslucentStatus。具體如何實現(xiàn)沉浸式狀態(tài)欄槽唾,可以參考這篇席镀。

那是不是沉浸式狀態(tài)欄和SearchView就不能同時使用了呢?當(dāng)然不是:

  1. 如果你的targetSdkVersion>=21夏漱,那么只要不給api19設(shè)置沉浸式效果就可以了豪诲,api21以上的版本會自動開啟沉浸式效果,SearchView工作也正常挂绰。
  2. 如果你的targetSdkVersion<21屎篱,或者你想給api19也設(shè)置沉浸式效果,那么就將styles.xml里面的windowTranslucentStatus刪掉葵蒂,然后使用代碼的方式來實現(xiàn)沉浸式吧交播。

下面是簡單的沉浸式代碼實現(xiàn):

public class StatusBarCompat {

    public static void setupStatusBarView(Activity activity, ViewGroup decorViewGroup, boolean on,int colorRes) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            setTranslucentStatus(activity, on);
            View mStatusBarTintView = new View(activity);
            int mStatusBarHeight = 0;
            int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
            if (resourceId > 0) {
                mStatusBarHeight = activity.getResources().getDimensionPixelSize(resourceId);
            }
            FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, mStatusBarHeight);
            params.gravity = Gravity.TOP;
            mStatusBarTintView.setLayoutParams(params);
            mStatusBarTintView.setBackgroundResource(colorRes);
            mStatusBarTintView.setVisibility(View.VISIBLE);
            decorViewGroup.addView(mStatusBarTintView);
        }
    }

    private static void setTranslucentStatus(Activity activity,boolean on) {
        Window win = activity.getWindow();
        WindowManager.LayoutParams winParams = win.getAttributes();
        final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
        if (on) {
            winParams.flags |= bits;
        } else {
            winParams.flags &= ~bits;
        }
        win.setAttributes(winParams);
    }


}  

其實這個WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS的作用和windowTranslucentStatus是一樣的,但是為什么通過代碼的方式和通過資源文件的方式來實現(xiàn)有這么大的差別就不清楚了践付。

具體代碼可以參考Bigbang項目的WhiteListActivity的layout文件中的處理秦士。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市永高,隨后出現(xiàn)的幾起案子隧土,更是在濱河造成了極大的恐慌提针,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件曹傀,死亡現(xiàn)場離奇詭異辐脖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)皆愉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門嗜价,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人幕庐,你說我怎么就攤上這事久锥。” “怎么了异剥?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵奴拦,是天一觀的道長。 經(jīng)常有香客問我届吁,道長错妖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任疚沐,我火速辦了婚禮暂氯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘亮蛔。我一直安慰自己痴施,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布究流。 她就那樣靜靜地躺著辣吃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芬探。 梳的紋絲不亂的頭發(fā)上神得,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音偷仿,去河邊找鬼哩簿。 笑死,一個胖子當(dāng)著我的面吹牛酝静,可吹牛的內(nèi)容都是我干的节榜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼别智,長吁一口氣:“原來是場噩夢啊……” “哼宗苍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤讳窟,失蹤者是張志新(化名)和其女友劉穎让歼,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挪钓,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡是越,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年耳舅,在試婚紗的時候發(fā)現(xiàn)自己被綠了碌上。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡浦徊,死狀恐怖馏予,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盔性,我是刑警寧澤霞丧,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站冕香,受9級特大地震影響蛹尝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜悉尾,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一突那、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧构眯,春花似錦愕难、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至壹店,卻和暖如春猜丹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背硅卢。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工居触, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人老赤。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓轮洋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親抬旺。 傳聞我的和親對象是個殘疾皇子弊予,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

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