1.落筆緣由
研究Theme對(duì)Activity的影響帐我。
1)對(duì)Activity里的dialog樣式有影響括饶,不同的Activity主題會(huì)對(duì)dialog有不同的影響冯乘,例如入录,Theme.Black.NoTitleBar.Fullscreen會(huì)讓dialog標(biāo)題和里面控件的寬度和高度造成影響蛤奥,標(biāo)題顯示不完整,控件設(shè)置的寬高和實(shí)際不符等僚稿。
當(dāng)我把Activity的主題設(shè)置為T(mén)heme.Black.NoTitleBar.Fullscreen的時(shí)候凡桥,
這個(gè)activity里有一個(gè)自定義的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("目錄");
}
}
它的顯示效果如下:
如上面的代碼,本來(lái)是想直接定義Dialog的標(biāo)題欄的蚀同,所以我做了如下的動(dòng)作
但當(dāng)把Activity主題設(shè)置為T(mén)heme.Holo.Light.NoActionBar.Fullscreen的時(shí)候缅刽,效果是比較正常的,
丑爆了蠢络,那么我不定義標(biāo)題欄了效果會(huì)是怎么樣的呢衰猛,
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);
}
}
效果如下圖,一樣丑
總結(jié)一下刹孔,如果要通過(guò)最上面的這種方式來(lái)定義標(biāo)題啡省,那么Activity最好不要用Theme.Black.NoTitleBar.Fullscreen這個(gè)主題,
不過(guò)也可以直接設(shè)置dialog的標(biāo)題隱藏,然后在dialog的body里直接定義標(biāo)題的樣子髓霞。
2)對(duì)Activity的退出動(dòng)畫(huà)有無(wú)影響卦睹。當(dāng)把ActivityThree放在另一個(gè)進(jìn)程里跑的時(shí)候android:process="com.lgy.testTheme", 不會(huì)影響Activity的啟動(dòng)動(dòng)畫(huà)和退出動(dòng)畫(huà)方库。但是如果在退出Activity的時(shí)候同時(shí)調(diào)用android.os.Process.killProcess(android.os.Process.myPid());结序,那么就不會(huì)再指向退出動(dòng)畫(huà),畢竟Activity所在的進(jìn)程都被殺死了纵潦,當(dāng)然不會(huì)再執(zhí)行退出動(dòng)畫(huà)徐鹤。 所以windowIsTranslucent設(shè)置為true并不會(huì)影響Activity的退出和啟動(dòng)動(dòng)畫(huà)。
3)對(duì)Activity的popupWindow進(jìn)入的動(dòng)畫(huà)有影響邀层。當(dāng)讓Activity在另一個(gè)進(jìn)程跑的時(shí)候android:process="com.lgy.testTheme2"返敬,會(huì)出現(xiàn)下面的情況,當(dāng)windowDisablePreview設(shè)置為true且windowIsTranslucent設(shè)置為false的時(shí)候,popupWindow的進(jìn)入動(dòng)畫(huà)會(huì)失效被济。當(dāng)然救赐,如果windowIsTranslucent默認(rèn)情況下是false.
但如果沒(méi)有設(shè)置android:process="com.lgy.testTheme2",對(duì)popupWindow進(jìn)入的動(dòng)畫(huà)是沒(méi)有影響的
4)當(dāng)主題里設(shè)置了windowIsTranslucent為true的時(shí)候,也就是背景設(shè)置為透明经磅,<item name="android:windowIsTranslucent">true</item>泌绣,Activity的生命周期會(huì)受到影響。windowIsTranslucent設(shè)置為true之后预厌,會(huì)破壞生命周期阿迈。當(dāng)Activity A啟動(dòng)Activity B, A不透明轧叽,B透明苗沧,那么 A的onStop不會(huì)被調(diào)用,只會(huì)調(diào)用onPause炭晒。相當(dāng)于啟動(dòng)了一個(gè)dialog待逞。
2.總結(jié)
其實(shí)引發(fā)問(wèn)題的原因是Activity使用了系統(tǒng)自帶的主題,現(xiàn)在又兩種方法可以解決上面的問(wèn)題网严,一種找系統(tǒng)里另一個(gè)主題识樱,看看有沒(méi)有適合自己的,直接替換震束。第二種方法就是繼承該主題怜庸,但是將受影響的控件的屬性進(jìn)行修改。