編輯:關於Android編程
接上篇,繼續:
然後就是setShowsDialog(boolean showsDialog)方法。官方文檔是這樣解釋的:控制DialogFragment是否是一個dislog,如果設置為false,則沒有dialog被創建出來,你可以把它當做一個普通的Fragemnt使用。
開頭提到了,mShowsDialog默認為true,所以如果你把DialogFragment確實作為一個Dialog使用,那大可不必調這個方法。當我看到OnCreate的方法時,就更加確定。(官方文檔上說了一種情況,需要手動調用它,這種情況及其少見,有興趣的可以自行去研究)。
public void setShowsDialog(boolean showsDialog) {
mShowsDialog = showsDialog;
} @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mShowsDialog = mContainerId == 0;
if (savedInstanceState != null) {
mStyle = savedInstanceState.getInt(SAVED_STYLE, STYLE_NORMAL);
mTheme = savedInstanceState.getInt(SAVED_THEME, 0);
mCancelable = savedInstanceState.getBoolean(SAVED_CANCELABLE, true);
mShowsDialog = savedInstanceState.getBoolean(SAVED_SHOWS_DIALOG, mShowsDialog);
mBackStackId = savedInstanceState.getInt(SAVED_BACK_STACK_ID, -1);
}
}mShowsDialog = mContainerId == 0;
沒錯,默認情況下,mContainerId就是0,所以mShowsDialog自然就是true;而當你在把它當成Fragment使用時,會為其指定xml布局中位置,所以,mContainerId也會不為0,所以mShowsDialog自然就是false。
然後是LayoutInflater getLayoutInflater(Bundle savedInstanceState),這個方法被hide了,所以外部是調不到的。
簡單說一下這個getLayoutInflater方法,它的調用點是在onCreateView的時候,從先後順序來說getLayoutInflater在onCreateView之前。
摘自FragmentManager:
f.mView = f.onCreateView(f.getLayoutInflater(f.mSavedFragmentState),null, f.mSavedFragmentState);
/** @hide */
@Override
public LayoutInflater getLayoutInflater(Bundle savedInstanceState) {
if (!mShowsDialog) {
return super.getLayoutInflater(savedInstanceState);
}
mDialog = onCreateDialog(savedInstanceState);
switch (mStyle) {
case STYLE_NO_INPUT:
mDialog.getWindow().addFlags(
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
// fall through...
case STYLE_NO_FRAME:
case STYLE_NO_TITLE:
mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
}
if (mDialog != null) {
return (LayoutInflater) mDialog.getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
}
return (LayoutInflater) mActivity.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
}STYLE_NO_FRAME和STYLE_NO_TITLE都調用了mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
那它們兩個參數有什麼不同呢,答案就在開頭setStyle中,STYLE_NO_FRAME會再沒有theme的情況下,設置theme為android.R.style.Theme_Panel。
然後就是onCreateDialog方法,你可以重寫這個方法,創建一個自己定義好的dialog。默認情況下,會自己創建一個Dialog。
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new Dialog(getActivity(), getTheme());
} public void onDismiss(DialogInterface dialog) {
if (!mViewDestroyed) {
dismissInternal(true);
}
} @Override
public void onStart() {
super.onStart();
if (mDialog != null) {
mViewDestroyed = false;
mDialog.show();
}
} @Override
public void onStop() {
super.onStop();
if (mDialog != null) {
mDialog.hide();
}
} @Override
public void onDestroyView() {
super.onDestroyView();
if (mDialog != null) {
mViewDestroyed = true;
mDialog.dismiss();
mDialog = null;
}
}好了,以上就是DialogFragment源碼部分。
小結:
1、DialogFragment本質上說就是Fragment,只是其內部還有一個dialog而已。你既可以當它是Dialog使用,也可以把它作為Fragment使用。
2、setStyle中,style的參數是不可以相互一起使用的,只能用一個,如果還不滿足你使用,可以通過設置theme來滿足。
3、setStyle的調用點,要放在onCreateView前,否則,設置的style和theme將不起作用!
Android UI開發第四十三篇——使用Property Animation實現墨跡天氣3.0引導界面及動畫實現
前面寫過《墨跡天氣3.0引導界面及動畫實現》,裡面完美實現了動畫效果,那一篇文章使用的View Animation,這一篇文章使用的Property Animation實
Android多點觸控實現對圖片放大縮小平移,慣性滑動等功能
文章將在原有基礎之上做了一些擴展功能: 1.圖片的慣性滑動 2.圖片縮放小於正常比例時,松手會自動回彈成正常比例 3.圖片縮放大於最大比例時,松手會自動回彈成最大比例實現
Android自定義仿微信PopupWindow效果
給大家分享一個高仿微信的PopupWindow、就是微信的掃一掃那個功能窗口、下面有應用運行效果圖、更加直觀的展示了Demo的效果、源代碼是通過兩種方法實現的、大家可以下
android沉浸式狀態欄、變色狀態欄、透明狀態欄、修改狀態欄顏色及透明
首先我要區分清楚沉浸式狀態欄與變色狀態欄。沉浸式狀態欄指的是,狀態欄隱藏,在手指做了相關操作後,狀態欄顯示出來,例如視頻播放器,在播放視頻時是隱藏狀態欄的,但是點擊屏幕的