【問題現(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è)置透明主題樣式的需求