对话框在Android中的应用场景也是很多的,例如删除、支付等重要的操作,需要提醒用户是否继续,这样很好的提高了用户的体验
这里总结了Android中常用的对话框,虽然只是旧版本的,但当做参考也差不多足够了
对话框是提示用户作出决定或输入额外信息的小窗口。 对话框不会填充屏幕,通常用于需要用户采取行动才能继续执行的模式事件
因为布局文件太简单这里就不展现出来了,免得占空间影响阅读
这里引入一个优化代码的理念:就是当一个布局下的子控件都要响应相同的事件或者执行相同的方法,可以通过布局对象获取到子控件,通过循环来对每一个子控件进行操作,这样既减少了代码量,也提高了应用的性能。 感觉自己表达能力欠佳,具体还是看代码吧
private Context context; // 上下文
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dialog);
context = this;
// 引用布局中的根节点(优化)
LinearLayout layout = (LinearLayout) findViewById(R.id.layout);
int childCount = layout.getChildCount();// 得到该布局对象的子控件的数量
for (int i = 0; i < childCount; i++) { // 遍历布局视图
View view = layout.getChildAt(i);
view.setOnClickListener(this);// 对所有的子控件添加点击事件
}
}
showDialog(int id)这方法Google已经废弃掉了,提倡使用DialogFragment来显示Dialog的。但这里只是为了把Dialog显示出来,重点是如何写Dialog,用这个就可以了。其实是我还不会用DialogFragment,哈哈,好尴尬啊
@Override
public void onClick(View v) {
// 优化
showDialog(v.getId());
}
重载父类的方法,通过onCreateDialog()方法初始化每个Dialog,并返回Dialog对象提供给showDialog()方法显示出来
@Override
protected Dialog onCreateDialog(int id) {
Dialog dialog = null;
switch (id) {
case R.id.normal_btn:
dialog = normalDialog();
break;
case R.id.menu_btn:
dialog = menuDialog();
break;
case R.id.radio_btn:
dialog = radioDialog();
break;
case R.id.multi_btn:
dialog = multiDialog();
break;
case R.id.input_btn:
dialog = inputDialog();
break;
default:
break;
}
return dialog;
}
下面是常用对话框的具体实现,已经封装到方法中,相应的注释也已加上。为了装装B,使用了链式编程,看起来似乎好高大上,如果不知道链式编程是什么,那很好,我装B成功了,哈哈
标准对话框
private Dialog normalDialog() {
// 生成一个警告对话框的构建器
AlertDialog.Builder builder = new Builder(context);
builder.setIcon(R.drawable.emoji_054);// 设置对话框的图标
builder.setTitle("标准对话框");
builder.setMessage("确定要支付吗");// 提示信息
// 设置积极的按钮
builder.setPositiveButton("确定", myClickListener);
// 设置消极的按钮
builder.setNegativeButton("取消", myClickListener);
// 设置中间的按钮
builder.setNeutralButton("摆设", myClickListener);
// 优化
return builder.create();
// dialog.show();
}
/**
* 监听器
*/
DialogInterface.OnClickListener myClickListener = new DialogInterface.OnClickListener() {
// dialog:AlertDialog which:你点击了哪一个按钮
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case -1:
Toast.makeText(context, "支付成功", Toast.LENGTH_SHORT).show();
break;
case -2:
Toast.makeText(context, "֧支付失败", Toast.LENGTH_SHORT).show();
break;
case -3:
Toast.makeText(context, "对我就是֧摆设的", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
};
以下对话框使用到的数据是在strings.xml里定义的数组
<string-array name="hadleset">
<item>小米</item>
<item>魅族</item>
<item>中兴</item>
<item>华为</item>
<item>联想</item>
</string-array>
菜单式对话框
private Dialog menuDialog() {
// 通过资源包来获取数组资源
final String[] items = getResources().getStringArray(R.array.hadleset);
// 生成一个对话框的构建器
AlertDialog.Builder builder = new Builder(context);
// 链式编程
return builder.setIcon(R.drawable.emoji_058)
.setTitle("菜单式对话框")
.setItems(R.array.hadleset,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int which) {
Toast.makeText(context, items[which],
Toast.LENGTH_SHORT).show();
}
}).create();
// .show();
}
单选对话框
private int mWhich = 2; //成员变量
private Dialog radioDialog() {
// 通过资源包来获取数组资源
final String[] items = getResources().getStringArray(R.array.hadleset);
// 生成一个对话框的构建器
AlertDialog.Builder builder = new Builder(context);
// 链式编程
return builder.setIcon(R.drawable.emoji_100)
.setTitle("单选对话框")
.setSingleChoiceItems(items, mWhich,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int which) {
mWhich = which;
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(context, items[mWhich],
Toast.LENGTH_SHORT).show();
}
}).setNegativeButton("取消", null)
.create();
// .show();
}
复选对话框
private Dialog multiDialog() {
// 通过资源包来获取数组资源
final String[] items = getResources().getStringArray(R.array.hadleset);
// 生成一个对话框的构建器
AlertDialog.Builder builder = new Builder(context);
// 链式编程
return builder.setIcon(R.drawable.emoji_058)
// 设置对话框的图标
.setTitle("复选对话框")
// itemsId:复选项的资源id checkedItems:复选项的初始值(true|false),可以直接写null(表示全部没选中)
.setMultiChoiceItems(R.array.hadleset,
new boolean[] { true, true, false, false, false },
new DialogInterface.OnMultiChoiceClickListener() {
// 当点击复选项时回调该方法
// dialog:AlertDialog;
// which:你点了哪个复选项,值是该复选项在数组中的position;
// isChecked:复选项的状态
public void onClick(DialogInterface dialog,int which, boolean isChecked) {
Toast.makeText(context,items[which] + isChecked,
Toast.LENGTH_SHORT).show();
}
})
.setPositiveButton(R.string.perform,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int which) {
// 当点击复选对话框确定按钮时,要显示
AlertDialog alertDialog = (AlertDialog) dialog;// 强转为警告对话框
ListView multiListView = alertDialog.getListView();// 取得复选对话框的列表视图
SparseBooleanArray selects = multiListView.getCheckedItemPositions();
StringBuffer sb = new StringBuffer();
int size = selects.size();
for (int i = 0; i < size; i++) {
// 假如SparseBooleanArray当前条目的value值为真
if (selects.valueAt(i)) {
// 取得复选项的position信息
int position = selects.keyAt(i);
String selectStr = multiListViewgetAdapter().getItem(position)
.toString();
sb = sb.append(selectStr);
}
}
Toast.makeText(context, sb.toString(),Toast.LENGTH_SHORT).show();
}
}).setNegativeButton(R.string.cancel, null)
.create();
// .show();
}
自定义对话框就是自己写一个布局文件,然后把它塞进Dialog中去,再然后就响应相关的事件,and...好像可以了,嗯就是这样
自定义对话框
/**
* 1、创建一个Dialog对象,并且设置对话框的主题(样式)
* 2、设置对话框显示的视图界面
* 3、对输入对话框的确定按钮添加点击监听,当点击该按钮后,输入用户输入的数据
*/
private Dialog inputDialog() {
final Dialog dialog = new Dialog(context, android.R.style.Theme_Dialog);
View view = getLayoutInflater().inflate(R.layout.input_dialog, null);
final EditText dataEdit = (EditText) view.findViewById(R.id.edit);// 引用输入对话框布局的输入控件
Button positive = (Button) view.findViewById(R.id.perfrom);// 引用输入对话框布局的确定按钮控件
Button negative = (Button) view.findViewById(R.id.cancel);
positive.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String inputData = dataEdit.getText().toString().trim();
Toast.makeText(context, inputData, Toast.LENGTH_SHORT).show();
dataEdit.setText("");
dialog.dismiss();// 对话框在Activity中消失
}
});
negative.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);// 无标题
dialog.setContentView(view);// 设置对话框的内容视图
return dialog;
// dialog.show();
}
其实现在的应用差不多都是用5.0后的Material Design来设计的了,它的视觉体验更好,更Android。而MD式的Dialog也是比5.0前好看好多好多,那为什么我没有用MD去写呢,因为我不会啊。
因为拖延症,我还没有去学呢
好吧我又找借口了,其实就是懒(心里默默地流泪)
希望对你们会有所帮助