Android setTheme設(shè)置透明主題無效

【問題現(xiàn)象】

1、首先,你在AndroidManifest.xml中聲明一個activity尚揣,不給application或者activity設(shè)置android:theme, 例如這樣:

  <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true">
        <activity android:name=".MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

或者是給application或者activity設(shè)置一個非透明的主題翠拣,例如這樣:



    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen">
        <activity android:name=".MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

2闸英、接著谆沃,你企圖在代碼中動態(tài)設(shè)置該activity的主題為透明主題钝凶,例如這樣:

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        setTheme(android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv = findViewById(R.id.sample_text);
        tv.setText(stringFromJNI());
    }

那么,我們來看看運行效果:


很明顯管毙,背景并沒有變透明腿椎,依然是黑色背景桌硫,所以在super.onCreate(savedInstanceState)前設(shè)置透明背景也是無效的
3夭咬、然后,有人說铆隘,你設(shè)置的位置不對吖卓舵,setTheme這句代碼應(yīng)該放在super.onCreate(savedInstanceState)之后,setContentView之前設(shè)置才有效果膀钠,那么掏湾,我們來試試:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);
        setContentView(R.layout.activity_main);
        TextView tv = findViewById(R.id.sample_text);
        tv.setText(stringFromJNI());
    }

看看出來的效果:


很明顯裹虫,依然還是沒有變成透明主題效果
4、那么融击,我們再試試重寫getTheme來返回透明的主題樣式筑公,看看是否有效果

 @Override
    public Resources.Theme getTheme() {
        Resources.Theme theme = super.getTheme();
        theme.applyStyle(android.R.style.Theme_Translucent_NoTitleBar_Fullscreen, true);
        return theme;
    }

結(jié)果還是跟上面一樣,背景依然不是透明

【問題分析】

在上面尊浪,我們嘗試各種操作(其實這些操作都是百度搜索到網(wǎng)上說的做法)匣屡,都沒法在代碼里面動態(tài)將activity的主題樣式設(shè)置為透明,那么問題點出在哪里了呢拇涤?后來決定Google搜索一下捣作,發(fā)現(xiàn)有個英文博客提到一個關(guān)鍵點:


這個英文博客提到要是設(shè)置的是非透明主題樣式的話,直接用setTheme設(shè)置是可以動態(tài)設(shè)置的鹅士,但是假如你想要通過setTheme設(shè)置透明主題樣式的話券躁,android系統(tǒng)似乎自動忽略了你透明主題中的windowIsTranslucent=true這個標(biāo)志,依然還是顯示非透明的主題樣式

【問題解決】

我們看看那個英文博客說怎么解決這個問題呢掉盅?


1也拜、首先,在AndroidManifest.xml中給activity隨便設(shè)置一個透明的主題樣式怔接,比如: @android:style/Theme.Translucent搪泳,這樣設(shè)置之后,你在代碼里隨便設(shè)置哪個透明主題都可以生效
2扼脐、然后博客提到不可以直接調(diào)用setTheme(R.style.MyOwnTranslucentTheme)來設(shè)置主題樣式岸军,因為這樣會使得透明失效,而是通過調(diào)用getTheme().applyStyle(R.style.MyOwnTranslucentTheme, true)來設(shè)置自己想要的透明樣式
其實瓦侮,我測試直接調(diào)用setTheme就可以設(shè)置艰赞,你們可以試試

【尾聲】

可能有人有疑問說,既然直接在AndroidManifest.xml設(shè)置透明主題樣式是可以直接生效的肚吏,為何還要多此一舉在代碼通過setTheme來動態(tài)設(shè)置呢方妖?其實,應(yīng)用場景還是挺多的罚攀,比如:
1党觅、本來你的activity是個非透明主題樣式或者是個透明有標(biāo)題的主題樣式,然后在某個時間斋泄,你希望動態(tài)設(shè)置為透明無標(biāo)題全屏主題樣式杯瞻,那么你就需要通過setTheme來動態(tài)設(shè)置
2、插件化加載插件的activity時候炫掐,占位activity就需要根據(jù)插件真實的主題樣式設(shè)置魁莉,所以也是會需要用到setTheme去動態(tài)設(shè)置透明主題樣式的需求

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子旗唁,更是在濱河造成了極大的恐慌畦浓,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件检疫,死亡現(xiàn)場離奇詭異讶请,居然都是意外死亡,警方通過查閱死者的電腦和手機屎媳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門秽梅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人剿牺,你說我怎么就攤上這事企垦。” “怎么了晒来?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵钞诡,是天一觀的道長。 經(jīng)常有香客問我湃崩,道長荧降,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任攒读,我火速辦了婚禮朵诫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘薄扁。我一直安慰自己剪返,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布邓梅。 她就那樣靜靜地躺著脱盲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪日缨。 梳的紋絲不亂的頭發(fā)上钱反,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機與錄音匣距,去河邊找鬼面哥。 笑死,一個胖子當(dāng)著我的面吹牛毅待,可吹牛的內(nèi)容都是我干的尚卫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼恩静,長吁一口氣:“原來是場噩夢啊……” “哼焕毫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起驶乾,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤邑飒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后级乐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疙咸,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年风科,在試婚紗的時候發(fā)現(xiàn)自己被綠了撒轮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡贼穆,死狀恐怖题山,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情故痊,我是刑警寧澤顶瞳,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站愕秫,受9級特大地震影響慨菱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜戴甩,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一符喝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧甜孤,春花似錦协饲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至二跋,卻和暖如春战惊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扎即。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工吞获, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谚鄙。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓各拷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親闷营。 傳聞我的和親對象是個殘疾皇子烤黍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348