---恢复内容开始---
安卓的对话框有两种: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:
@Overrideprotected 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()?
---恢复内容结束---
时间: 2024-08-12 20:22:34