zoukankan      html  css  js  c++  java
  • 关于提示对话框的总结

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

    安卓的对话框有两种: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()?













    
    

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

  • 相关阅读:
    Wicket框架使用小结
    【YII是个什么鬼】YII入门——URL Manager配置
    【碎碎念】你要做重要的工作
    【科普】五分钟分清网页钟各种长度单位px、em、rem
    【CSS】最简单的css3实现的水平导航栏的手风琴效果
    PYTHON__关于Socket中的Select使用理解
    PIG__Failed to create DataStorage解决方案
    MYSQL__Mysql免安装版的使用(Windows7)
    PYTHON__生成器和普通函数的区别
    vim status 颜色配置
  • 原文地址:https://www.cnblogs.com/Dionexin/p/5722725.html
Copyright © 2011-2022 走看看