1.落筆緣由
研究Theme對Activity的影響。
1)對Activity里的dialog樣式有影響,不同的Activity主題會對dialog有不同的影響,例如,Theme.Black.NoTitleBar.Fullscreen會讓dialog標題和里面控件的寬度和高度造成影響,標題顯示不完整,控件設置的寬高和實際不符等。
當我把Activity的主題設置為Theme.Black.NoTitleBar.Fullscreen的時候,
這個activity里有一個自定義的Dialog
public class OutlineDialog extends Dialog {
public OutlineDialog(Context context) {
super(context);
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
final ListView listView = new ListView(getContext());
listView.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
setContentView(R.layout.dialog_body_layout);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.pdf_list_title);
final Button btn_outline_close = (Button) findViewById(R.id.title_btn_close);
btn_outline_close.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
dismiss();
}
});
final TextView tv_outline_title = (TextView) findViewById(R.id.list_title);
tv_outline_title.setText("目錄");
}
}
它的顯示效果如下:
image.png
如上面的代碼,本來是想直接定義Dialog的標題欄的,所以我做了如下的動作
image.png
但當把Activity主題設置為Theme.Holo.Light.NoActionBar.Fullscreen的時候,效果是比較正常的,
image.png
丑爆了,那么我不定義標題欄了效果會是怎么樣的呢,
public class OutlineDialog2 extends Dialog {
public OutlineDialog2(Context context) {
super(context);
}
/**
* @param context
* @param theme
*/
public OutlineDialog2(Context context, int theme)
{
super(context, theme);
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle("123");
setContentView(R.layout.dialog_body_layout);
}
}
效果如下圖,一樣丑
image.png
總結一下,如果要通過最上面的這種方式來定義標題,那么Activity最好不要用Theme.Black.NoTitleBar.Fullscreen這個主題,
image.png
不過也可以直接設置dialog的標題隱藏,然后在dialog的body里直接定義標題的樣子。
2)對Activity的退出動畫有無影響。當把ActivityThree放在另一個進程里跑的時候android:process="com.lgy.testTheme", 不會影響Activity的啟動動畫和退出動畫。但是如果在退出Activity的時候同時調用android.os.Process.killProcess(android.os.Process.myPid());,那么就不會再指向退出動畫,畢竟Activity所在的進程都被殺死了,當然不會再執行退出動畫。 所以windowIsTranslucent設置為true并不會影響Activity的退出和啟動動畫。
3)對Activity的popupWindow進入的動畫有影響。當讓Activity在另一個進程跑的時候android:process="com.lgy.testTheme2",會出現下面的情況,當windowDisablePreview設置為true且windowIsTranslucent設置為false的時候,popupWindow的進入動畫會失效。當然,如果windowIsTranslucent默認情況下是false.
但如果沒有設置android:process="com.lgy.testTheme2",對popupWindow進入的動畫是沒有影響的
image.png
4)當主題里設置了windowIsTranslucent為true的時候,也就是背景設置為透明,<item name="android:windowIsTranslucent">true</item>,Activity的生命周期會受到影響。windowIsTranslucent設置為true之后,會破壞生命周期。當Activity A啟動Activity B, A不透明,B透明,那么 A的onStop不會被調用,只會調用onPause。相當于啟動了一個dialog。
2.總結
其實引發問題的原因是Activity使用了系統自帶的主題,現在又兩種方法可以解決上面的問題,一種找系統里另一個主題,看看有沒有適合自己的,直接替換。第二種方法就是繼承該主題,但是將受影響的控件的屬性進行修改。