各位看官们大家好,上一回中咱们说的例子是"自定义Dialog主题",这一回中咱们说的例子是" 自定义Dialog"。闲话休提,言归正转, 让我们一起Talk Android吧!
整体思路
我们在上一章回中介绍了如何定义Dialog的主题,本章回将介绍如何自定义Dialog。
下面我分享一个整体的思路。自定义一个Dialog的子类,然后在此子类中使用自定义的主题和布局。布局的内容自己决定,我们把布局中的内容显示出来,并且可以响应相关的事件就可以。
这种自定义方式的思路就是我们在前面章回中介绍过的扩展系统组件,我们在这里扩展的组件是Dialog.
实现方法
有了整体的思路后,我们通过文字结合代码的方式来演示如何自定义Dialog。
第一步
创建Dialog的子类,我们没有直接继承Dialog而继承了它的子类AlertDialog
public class DialogCustom extends AlertDialog {
//需要重写构造方法,这里就不列出来了
}
第二步
.创建Dialog对象,创建对象时绑定自定义的主题(也就是上一章回中介绍的主题)
mAlertDialog = new AlertDialog.Builder(mContext, R.style.CustomDialogTheme).create();
第三步
自定义布局文件,并且绑定到Dialog上,可以使用Dialog的Builder绑定,也可以使用window绑定;
Window window = mAlertDialog.getWindow();
WindowManager.LayoutParams layoutParams = window.getAttributes();
//layoutId是自定义的布局id
View contentView = LayoutInflater.from(mContext).inflate(layoutId,null);
// builder.setView(contentView);
// builder.setView(R.layout.dialog_input_content_view);
//使用Window的setView效果好一些
window.setContentView(contentView);
第四步
显示布局中的组件,给组件添加事件响应;
mBTYes = (Button) window.findViewById(R.id.id_bt_dialog_yes);
mBTNo = (Button) window.findViewById(R.id.id_bt_dialog_no);
mBTYes.setOnClickListener(v -> onYesButtonClicked());
mBTNo.setOnClickListener(v -> onNoButtonClicked());
mTitle = (TextView)window.findViewById(R.id.id_dialog_cust_info_title) ;
mContent =(TextView)window.findViewById(R.id.id_dialog_cust_info_content) ;
mTitle.setText("Custom dialog Title");
mContent.setText("This is a content");
在自定义的布局中我们使用TextView
来显示Dialog的标题和消息内容;使用Button来响应Yes/No事件,我们只列出了事件的方法,没有列出这些方法的实现内容,我推荐的做法是创建监听器,让调用Dialog的程序来实现监听器,这样可以更加灵活地使用Dialog。毕竟系统组件中的Dialog也是这么做的。下面是示例代码:
private void onYesButtonClicked () {
if(mYesBTClickedListener != null) {
mYesBTClickedListener.onBTClicked();
mAlertDialog.dismiss();
}
}
private void onNoButtonClicked () {
if(mNoBTClickedListener != null) {
mNoBTClickedListener.onBTClicked();
mAlertDialog.dismiss();
}
}
public interface OnYesBTClickedListener {
void onBTClicked();
}
public interface OnNoBTClickedListener {
void onBTClicked();
}
public void setYesBTClickedListener(OnYesBTClickedListener yesBTClickedListener) {
mYesBTClickedListener = yesBTClickedListener;
}
public void setNoBTClickedListener(OnNoBTClickedListener noBTClickedListener) {
mNoBTClickedListener = noBTClickedListener;
}
所有代码ok后还需要调用Dialog的show
()方法来显示Dialog。我在这里就不演示程序的运行结果了,建议大家自己动手去实践。
看官们,关于"自定义Dialog
"的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!