天天看點

android activity theme dialog,Android之Activity設定主題背景後AlertDialog的背景随之改變的問題...

在制作App的閃屏頁時如果你仔細觀察就會發現,每次你在手機桌面點選圖示啟動應用時會先出現一個白色背景(也就是我們通常所說的白屏),然後才會跳轉到閃屏頁。就像這樣:

android activity theme dialog,Android之Activity設定主題背景後AlertDialog的背景随之改變的問題...

關于如何解決啟動時的白屏問題,大家可以參考這篇部落格:

Android App 啟動頁(Splash)黑/白閃屏現象産生原因與解決辦法。解決的方法很簡單,就是在SplashActivity的主題中将背景設定成給閃屏頁一樣的圖檔:

true

true

@drawable/splash_bg

然後在清單檔案中将SplashActivity的theme設定成android:theme="@style/SplashTheme"即可。下面就是去除白屏後的效果:

android activity theme dialog,Android之Activity設定主題背景後AlertDialog的背景随之改變的問題...

在實際項目中,應用往往會在剛啟動時檢測是否有新的版本,如果有的話就會彈出一個提示對話框詢問使用者是否需要更新,或者直接強制使用者更新。對話框我們選用系統原生的AlertDialog就好(為了相容低版本最好選擇v7包下),但我個人更喜歡将其封裝到DialogFragment中,代碼如下:

public class UpdateDialog extends DialogFragment {

@Override

public Dialog onCreateDialog(Bundle savedInstanceState) {

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

builder.setTitle("檢測到新版本啦!");

builder.setMessage("1、優化了UI細節;\n2、修複了一大波的bug");

//立即更新按鈕

builder.setPositiveButton("立即更新", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

//這裡執行更新操作

Toast.makeText(getActivity(), "執行更新操作", Toast.LENGTH_SHORT).show();

dialog.dismiss();

}

});

//稍後再說按鈕

builder.setNegativeButton("稍後再說", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

//跳轉到首頁

SplashActivity activity = (SplashActivity) getActivity();

activity.toMainPage();

dialog.dismiss();

}

});

AlertDialog dialog = builder.create();

dialog.show();

//修改按鈕顔色,必須在show方法之後調用

dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.BLUE);

dialog.getButton(DialogInterface.BUTTON_NEGATIVE).setTextColor(Color.RED);

return dialog;

}

}

當然,版本更新的邏輯不可能這麼簡單的,我們這裡隻是簡單地先顯示一個對話框。DialogFragment的顯示很簡單,隻需調用一句代碼:

new UpdateDialog().show(getFragmentManager(),"VersionUpdate");

運作之後,發現AlertDialog的樣式變得十分詭異:

android activity theme dialog,Android之Activity設定主題背景後AlertDialog的背景随之改變的問題...

如果沒有左上角的文字,我幾乎就看不出它是個對話框了。明明我們用的就是原生的AlertDialog,為什麼會變成這副模樣呢?

還記得我們前面為了解決啟動時白屏在Activity的樣式中将background設定成了閃屏頁背景圖檔嗎?現在對話框的背景也是這張圖檔,怎麼這麼巧?去掉SplashActivity的樣式SplashTheme中的@drawable/splash_bg,再次運作就會發現,對話框的背景變成了白色,這正是我們想要的樣式:

android activity theme dialog,Android之Activity設定主題背景後AlertDialog的背景随之改變的問題...

現在看來,在Activity中修改主題樣式的背景也會影響到其他控件的背景的,這裡的AlertDialog的背景就被強制變成了閃屏頁的圖檔。那麼有什麼辦法既可以解決啟動白屏,又能保留住Dialog自身對話框的嗎?

經過我的實踐,發現在代碼中設定Dialog的背景沒有效果,必須在樣式中去設定,我們可以給AlertDialog設定一個style:

@android:color/white

這裡我們就單獨将對話框的背景設為白色,要注意的是一定要選擇好繼續的樣式,也就是@android:style/Theme.DeviceDefault.Light.Dialog.NoActionBar.MinWidth。從它的名字就可以看出它有如下的作用:

Light表示它是淺色主題,也就是對話框的Title和Message文字顔色會是黑色的;

NoActionBar則去除了頂部的标題欄;

MinWidth保證了它具有最小寬度,不會縮成一團。

回到UpdateDialog中,設定AlertDialog的樣式就可以了:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.UpdateDialogStyle);

所有的代碼都已經在文章中展現了,源碼就不放了。希望能夠對大家有所幫助,少踩一些坑。