关于提示对话框的总结

---恢复内容开始---

安卓的对话框有两种:PopupWindow和AlterDialog

它们的不同点在于:AlterDialog的位置固定(提示对话框:ps暂且自己先这样理解),而PopupWindow的位置可以随意(逐渐显示出来的窗口 :ps也是按照自己理解来吧)

AlertDialog需要建立一个创建者AlertDialog.Builder bulider

AlertDialog.Builder bulider=new AlertDialog.Builder(AlertActivity.this);

由bulider对象去完成AlterDialog的某些功能,例如:
bulider.setTitle("提示");//提示对话框的标题
bulider.setIcon(R.mipmap.ic_launcher);//所显示的图片
bulider.setMessage("你确定这样做吗?");//提示信息

并且要设置与用户交互的接口的方法,供用户操作.实现方法如下:
bulider.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
Toast.makeText(getBaseContext(), "确定", Toast.LENGTH_SHORT).show();
}
});
bulider.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getBaseContext(), "取消", Toast.LENGTH_SHORT).show();
}
});

AlterDialog还提供了单选对话框和多选对话框(ps:个人觉得这两种对话框还蛮好玩的,具体好玩的原因我也不知道......嘻嘻)
单选对话框:
@Override
public void onClick(View v) {
AlertDialog.Builder bulider=new AlertDialog.Builder(AlertActivity.this);
bulider.setCancelable(false);
final String[]items={"北京","上海","烟台"};
bulider.setSingleChoiceItems(items, 1, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getBaseContext(), items[which].toString(), Toast.LENGTH_SHORT).show();
dialog.dismiss();

}
});
AlertDialog alertDialog = bulider.create();
alertDialog.show();
}
});
在这里我遇到了几个问题:
1.bulider.setCancelable(false);//不知道这句话是干什么用的 T_T.
2.自己写代码的时候,没有注意到items 要设置为final 常量
3.dialog,dismiss();//作用是取消对话框
4.在方法的最后要记得创建bulider :bulider.create();


多选对话框:
bt3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder bulider=new AlertDialog.Builder(AlertActivity.this);
bulider.setCancelable(false);
bulider.setTitle("选择你所在的城市");
final String[] items={"北京","上海","烟台"};
final boolean[] boo={false,false,false};//为什么要设置三个布尔值
bulider.setMultiChoiceItems(items, null, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
if (isChecked) {
Toast.makeText(getBaseContext(), items[which].toString(), Toast.LENGTH_SHORT).show();
boo[which]=true;
}else{
boo[which]=false;
}
}
});
bulider.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
StringBuffer sf = new StringBuffer();
for (int i = 0; i < items.length; i++) {
if (boo[i] == true)
sf.append(items[i] + "");
}
Toast.makeText(getBaseContext(), sf.toString(), Toast.LENGTH_SHORT).show();
dialog.dismiss();
}

});
AlertDialog alertDialog=bulider.create();
alertDialog.show();
}
});
多选对话框和单选对话框总体结构还是差不多的,只不过多了几种选择,多了checkBox选项

遇到的问题:
1.final boolean[] boo={false,false,false};//为什么要设置三个布尔值
答:这应该是设置的默认状态下,没有选中的城市。但是后面的实现方法中有:bulider.setMultiChoiceItems(items, null, new DialogInterface.OnMultiChoiceClickListener()
传了一个null,既然没有传参数,为什么还要设置默认状态下没有选中的城市呢?


关于getLayoutinflater加载器自己的理解:
bt4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
View view=getLayoutInflater().inflate(R.layout.toast_layout,null);
ImageView iv = (ImageView) view.findViewById(R.id.toast_iv);
iv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(AlertActivity.this, "点击图片", Toast.LENGTH_SHORT).show();
}
});
AlertDialog.Builder bulider=new AlertDialog.Builder(AlertActivity.this);
bulider.setView(view);
AlertDialog alertDialog=bulider.create();
alertDialog.show();
}
});


纯属个人菜鸟式的理解(错了的地方还希望能指出):Layoutinflater它的作用给我的感觉有点类似于findViewByid().不同点是layoutinflater是用来找res/layout/下的xml文件,并且实现
但是在xml文件中并找不到,有点抽象化。上面程序中的view 就是通过layoutinflater加载进内存空间,并不再xml文件。而findViewByid是找xml布局文件下的具体控件(例如button,textview之类的)
Layoutinflater它的具体作用:
1.对于一个没有被写入xml文件,但是却想要被载入,或者说想要拿到并使用他的界面,就需要用到layoutinflater.inflater();方法了
2.对于一个被写入xml文件,想要拿到并使用它的布局界面,可以使用findViewByid()方法来获取其中的布局控件


PopupWindow:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pop_window);
bt1=(Button)findViewById(R.id.bt1);
View v=getLayoutInflater().inflate(R.layout.toast_layout,null);
final PopupWindow pw=new PopupWindow(v);
pw.setFocusable(true);//设置焦点的状态
ColorDrawable cd=new ColorDrawable();
pw.setBackgroundDrawable(cd);
pw.setAnimationStyle(R.style.pop);//设置动画的样式
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
pw.setWidth(view.getWidth());
int height=getResources().getDisplayMetrics().heightPixels/3;
pw.setHeight(height);
pw.showAsDropDown(view, 0, 0);//设置PopWindow显示的位置位于View的下边,X Y表示坐标偏移量
pw.showAtLocation(view, Gravity.TOP | Gravity.RIGHT, 0, 170);//展示的位置

}
});

}
注意:
1.pw.setFocusable(false)时,说明PopupWindow不能获得焦点,即使设置了背景不为空也不能点击外面消失,只能由dismiss()消失。但是外面的View事件还是可以触发,back键也可以顺利dismiss
掉。当设置为pw.setFocusable(true)时,背景不能为空,点击外面和Back键才会消失



PopupWindow总结如下:
1.为PopupWindow的view布局
View v=getLayoutInflater().inflate(R.layout.toast_layout,null);
2.显示位置,要用到showAsDropDown方法
3.进出场动画 要用到setAnimationStyle方法
4.消失 用dismiss()?














---恢复内容结束---

原文地址:https://www.cnblogs.com/Dionexin/p/5722725.html