《代码里的世界》 —UI篇
用文字札记描绘自己 android学习之路
转载请保留出处 by Qiao
http://blog.csdn.net/qiaoidea/article/details/46402845
【导航】
- 弹出式对话框各种方案 从仿QQ消息提示框来谈弹出式对话框的实现方式 (Dialog,PopupWind,自定义View,Activity,FragmentDialog)
- Dialog源码解析 从源码上看Dialog与DialogFragment
1.概述
前一篇写了常用的弹出框的几种实现方式,这里通过源码来简要解析下Dialog的实现原理。后便作为补充会讲下官方提倡的FragmentDialog。
2.源码解析
通常创建非阻塞式对话框的方式就是使用dialog了,不过在Android 3.0 之后,google更推荐使用新引入的基于Fragment的DialogFragment。这里我们从源码层次来看下详细实现。
2.1 Dialog
1.DialogInterface
Dialog对话框实现的接口有DialogInterface,Window.Callback, keyEvent.Callback,OnCreateContextMenuListener,后边几个基本的Activity、View等组件都或多或少实现了,这里侧重讲下Dialog专有的DialogInterface。
public interface DialogInterface {
public static final int BUTTON_POSITIVE = -1;
public static final int BUTTON_NEGATIVE = -2;
public static final int BUTTON_NEUTRAL = -3;
@Deprecated
public static final int BUTTON1 = BUTTON_POSITIVE;
@Deprecated
public static final int BUTTON2 = BUTTON_NEGATIVE;
@Deprecated
public static final int BUTTON3 = BUTTON_NEUTRAL;
public void cancel();
public void dismiss();
interface OnCancelListener {
public void onCancel(DialogInterface dialog);
}
interface OnDismissListener {
public void onDismiss(DialogInterface dialog);
}
interface OnShowListener {
public void onShow(DialogInterface dialog);
}
interface OnClickListener {
public void onClick(DialogInterface dialog, int which);
}
interface OnMultiChoiceClickListener {
public void onClick(DialogInterface dialog, int which, boolean isChecked);
}
interface OnKeyListener {
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event);
}
}
比较简单易懂,没什么要说的,定义了最基本的接口方法,一目了然。具体设置和使用都在在Dialog中详细实现。
2.Dialog全局变量
同样比较清晰容易理解,不过多解释。
private static final String TAG = "Dialog";
private Activity mOwnerActivity;//关联和创建它的activity
final Context mContext;
final WindowManager mWindowManager;
Window mWindow;
View mDecor;
private ActionBarImpl mActionBar;
protected boolean mCancelable = true;
private String mCancelAndDismissTaken;
private Message mCancelMessage;//取消指令
private Message mDismissMessage;//消失指令
private Message mShowMessage;//显示指令
private OnKeyListener mOnKeyListener;//点击事件
private boolean mCreated = false;
private boolean mShowing = false;
private boolean mCanceled = false;
private final Handler mHandler = new Handler();
private static final int DISMISS = 0x43;
private static final int CANCEL = 0x44;
private static final int SHOW = 0x45;
private Handler mListenersHandler;//消息指令接受处理handler