zoukankan      html  css  js  c++  java
  • 【幻化万千戏红尘】qianfeng-Android-Day11_Menu、ContextMenu、Dialog、PopupWindow

    Dialog及Menu

    一、Dialog对话框:

    (一)、分类:

    1. AlertDialog   警告对话框(提示对话框)
    2. ProgressDialog    进度对话框
    3. DatePickerDialog   日期选择对话框
    4. TimePickerDialog   时间选择对话框
    5. 自定义对话框登录对话框、关于对话框)
    6. 列表对话框
    • 普通列表对话框
    • 单选列表对话框
    • 多选列表对话框
    • 带图标的列表对话框

    (二)、AlertDialog ——简单对话框: 

    1、类结构:

    java.lang.Object

       ↳  android.app.Dialog

          ↳  android.app.AlertDialog

    2、创建AlertDialog对话框的步骤

    1. 创建AlertDialog.Builder对象,该对象能创建AlertDialog;
    2. 调用Builder对象的方法设置图标、标题、内容、按钮等;
    • setTitle():为对话框设置标题
    • setIcon ():设置图标
    • setMessage ():设置要显示的信息
    • setNegativeButton ():设置取消按钮
    • setPositiveButton ():设置确定按钮
    • setNeutralButton ():设置中立按钮
    1. 调用Builder对象的create()方法创建AlertDialog对话框;
    2. 调用AlertDialog的show()方法来显示对话框。

    3、核心代码:

    Builder builder = new AlertDialog.Builder(MainActivity.this);

    builder.setIcon(R.drawable.ic_launcher);

    builder.setTitle("提示");

    builder.setMessage("确认退出吗?");

    builder.setPositiveButton("确认", new OnClickListener() {

            @Override

            public void onClick(DialogInterface dialog, int which) {

                    text_main_info.setText("您点击了:" + which);

            }

    });

    builder.setNegativeButton("取消", new OnClickListener() {

            @Override

            public void onClick(DialogInterface dialog, int which) {

                    text_main_info.setText("您点击了:" + which);

            }

    });

    builder.setNeutralButton("中立", new OnClickListener() {

            @Override

            public void onClick(DialogInterface dialog, int which) {

                    text_main_info.setText("您点击了:" + which);

            }

    });

    builder.create().show();

    (三)、AlertDialog——列表对话框:

    1、类结构:

    java.lang.Object

       ↳  android.app.Dialog

          ↳  android.app.AlertDialog

    2、创建列表AlertDialog对话框的步骤

    1. 创建AlertDialog.Builder对象,该对象能创建AlertDialog;
    2. 调用Builder对象的方法设置图标、标题、内容、按钮等;
    • setTitle():为对话框设置标题
    • setIcon ():设置图标
    • setMessage ():设置要显示的信息
    • setNegativeButton ():设置取消按钮
    • setPositiveButton ():设置确定按钮
    • setNeutralButton ():设置中立按钮
    • setItems ():为对话框添加列表项
    • setSingleChoiceItems ():为对话框添加单选列表项
    • setMultiChoiceItems ():为对话框添加多选列表项
    • setAdapter ():为对话框添加带图标的列表项
    1. 调用Builder对象的create()方法创建AlertDialog对话框;
    2. 调用AlertDialog的show()方法来显示对话框。

    3、核心代码:

    【备注:使用setItems ()、setSingleChoiceItems ()、setMultiChoiceItems () 、setAdapter()能得到不同的结果。】

    //A. 普通列表

    button_main_simpleListDialog.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                    Builder builder = new AlertDialog.Builder(MainActivity.this);

                    builder.setIcon(R.drawable.ic_launcher);

                    builder.setTitle("请选择颜色:");

                    final String[] arrColor = new String[] { "红色", "绿色","蓝色" };

                    // 往对话框中放置普通列表

                    builder.setItems(arrColor, new OnClickListener() {

                            // 以下代码是模拟:勾选选项后,文字颜色和文本框背景颜色相应发生改变

                            @Override

                            public void onClick(DialogInterface dialog , int which) {

                                    text_main_info.setText(arrColor[which]);

                                    switch (which) {

                                    case 0:

                                            text_main_info.setBackgroundColor(Color.RED);

                                            break;

                                    case 1:

                                            text_main_info.setBackgroundColor(Color.GREEN);

                                            break;

                                    case 2:

                                            text_main_info.setBackgroundColor(Color.BLUE);

                                            break;

                                    default:

                                            break;

                                    }

                            }

                    });

                    builder.show();

            }

    });

    //B. 单选列表

    button_main_singleListDialog

    .setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                    Builder builder = new AlertDialog.Builder(MainActivity.this);

                    builder.setIcon(R.drawable.ic_launcher);

                    builder.setTitle("请选择颜色:");

                    final String[] arrColor = new String[] { "红色", "绿色","蓝色" };

                    // 往对话框中放置单选列表

                    builder.setSingleChoiceItems(arrColor, 0,

                                    new OnClickListener() {

                                            @Override

                                            public void onClick(DialogInterface dialog,int which) {

                                                    position = which;//通过这个监听器获取到点击的是第几个

                                            }

                                    });

                    builder.setPositiveButton("确认", new OnClickListener() {

                            @Override

                            public void onClick(DialogInterface dialog,int which) {

                                    text_main_info.setText(arrColor[position]);

                                    switch (position) {

                                    case 0:

                                            text_main_info.setBackgroundColor(Color.RED);

                                            break;

                                    case 1:

                                            text_main_info.setBackgroundColor(Color.GREEN);

                                            break;

                                    case 2:

                                            text_main_info.setBackgroundColor(Color.BLUE);

                                            break;

                                    default:

                                            break;

                                    }

                            }

                    });

                    builder.show();

            }

    });

    //C. 多选列表

    button_main_multiListDialog

    .setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                    Builder builder = new AlertDialog.Builder(MainActivity.this);

                    builder.setIcon(R.drawable.ic_launcher);

                    builder.setTitle("请选择颜色:");

                    final String[] hobbyArr = new String[] { "看书", "学习","饮食", "爬山", "绘画" };

                    // 将多选项中每次勾选的结果放到一个pos数组中。

                    pos = new boolean[hobbyArr.length];

                    // 往对话框中放置多选列表

                    builder.setMultiChoiceItems(hobbyArr, null,

                                    new OnMultiChoiceClickListener() {

                                            @Override

                                            public void onClick(DialogInterface dialog,int which, boolean isChecked) {

                                                    pos[which] = isChecked;//将每一项被勾选的状态放到一个boolean型的数组中

                                            }

                                    });

                    // 多选列表项必须要使用确认按钮才能最终获得所有勾选的数据。

                    builder.setPositiveButton("确认", new OnClickListener() {

                            @Override

                            public void onClick(DialogInterface dialog,int which) {

                                    // 将所有的勾选项放到一个字符串中

                                    StringBuilder sb = new StringBuilder();

                                    for (int i = 0; i < pos.length; i++) {

                                            if (pos[i]) {

                                                    sb.append(hobbyArr[i]);

                                                    sb.append("");

                                            }

                                    }

                                    text_main_info.setText("您勾选了:" + sb.toString());

                            }

                    });

                    builder.show();

            }

    });

    (四)、AlertDialog——自定义对话框:

    1、类结构:

    java.lang.Object

       ↳  android.app.Dialog

          ↳  android.app.AlertDialog

    2、创建自定义AlertDialog对话框的步骤

    1. 创建AlertDialog.Builder对象,该对象能创建AlertDialog;
    2. 调用Builder对象的方法设置图标、标题、内容、按钮等;
    • setTitle():为对话框设置标题
    • setIcon ():设置图标
    • setMessage ():设置要显示的信息
    • setNegativeButton ():设置取消按钮
    • setPositiveButton ():设置确定按钮
    • setNeutralButton ():设置中立按钮
    1. 自定义布局文件;
    2. 使用LayoutInflater  inflater()方法填充自定义的布局文件,返回view对象。用该对象的findViewById()方法加载自定义布局上所有控件;
    3. 调用Builder对象的setView()方法加载view对象;
    4. 调用Builder对象的create()方法创建AlertDialog对话框;
    5. 调用AlertDialog的show()方法来显示对话框。

    3、核心代码:本示例代码中写了一个显示登录窗口的登录框。

    【备注:】采用LayoutInflater去填充布局,返回view对象。

    View view = null;

    Builder builder = new AlertDialog.Builder(MainActivity.this);

    builder.setIcon(R.drawable.ic_launcher);

    builder.setTitle("管理员登录:");

    LayoutInflater mInflater = LayoutInflater.from(MainActivity.this);

    view = mInflater.inflate(R.layout.loginform_main, null);

    final EditText edit_loginform_username = (EditText) view

                    .findViewById(R.id.edit_loginform_username);

    final EditText edit_loginform_password = (EditText) view

                    .findViewById(R.id.edit_loginform_password);

    builder.setView(view);

    builder.setPositiveButton("登录", new OnClickListener() {

            @Override

            public void onClick(DialogInterface dialog, int which) {

                    String username = edit_loginform_username.getText()

                                    .toString().trim();

                    String password = edit_loginform_password.getText()

                                    .toString().trim();

                    if (username.length() < 1 || password.length() < 1) {

                            text_main_info.setText("用户名或密码不可以为空!");

                    } else {

                            StringBuilder sb = new StringBuilder();

                            sb.append("您的登录信息:");

                            sb.append("用户名:");

                            sb.append(username);

                            sb.append("密码:");

                            sb.append(password);

                            text_main_info.setText(sb.toString());

                    }

            }

    });

    builder.setNegativeButton("取消", new OnClickListener() {

            @Override

            public void onClick(DialogInterface dialog, int which) {

                    //此处进行异步任务访问网络等处理。

            }

    });

    builder.create().show();

    (五)、ProgressDialog——进度对话框:

    1、类结构:

    java.lang.Object

       ↳  android.app.Dialog

          ↳  android.app.AlertDialog

             ↳  android.app.ProgressDialog

    2、创建 ProgressDialog 对话框的步骤:

    • 实例化ProgressDialog,创建出ProgressDialog对象;
    • 调用该对象的方法设置图标、标题、内容、按钮等;
    • setTitle():为对话框设置标题setIcon ():设置图标setMessage ():设置要显示的信息
    • 调用 ProgressDialog 对象的show()方法显示出 ProgressDialog 对话框。

    3、核心代码:

    ProgressDialog pDialog = new ProgressDialog(MainActivity.this);

    pDialog.setTitle("提示:");

    pDialog.setMessage("数据加载中。。。");

    pDialog.show();

    二、OptionMenu选项菜单:

    (一)、简介:

    1、Android应用中的菜单默认是隐藏的,只有当用户点击手机上的MENU键,系统才会显示菜单。这种菜单叫做选项菜单(Option Menu)。

    2、从3.0开始,Android不要求手机设备上必须提供MENU按键。因此Android推荐使用ActionBar来代替Menu。

    (二)、创建菜单:(Android提供了两种创建菜单的方式)

    1、在java代码创建菜单;

    2、使用xml资源文件创建菜单(res/menu目录下)。建议使用后者。

    (三)、XML资源文件中定义菜单:

    1、普通菜单:

     <item

            android:id="@+id/menu_about"

            android:orderInCategory="2"

            android:showAsAction="never"

            android:title="关于"/>

    2、二级普通菜单:

     <item

            android:id="@+id/menu_group2"

            android:orderInCategory="1"

            android:showAsAction="never"

            android:title="文字颜色">

            <menu >

                <group>

                    <item android:id="@+id/font_red" android:title="red" />

                    <item android:id="@+id/font_green" android:title="green"></item>

                    <item android:id="@+id/font_blue" android:title="blue"></item>

                    <item android:id="@+id/font_yellow" android:title="yellow"></item>

                </group>

            </menu>

        </item>

    (四)、菜单操作:

                利用boolean onOptionsItemSelected(MenuItem item)回调方法。

    核心代码如下:利用以上定义的xml菜单文件,实现通过菜单选项对文字的大小和颜色进行控制。

            @Override

            public boolean onOptionsItemSelected(MenuItem item) {

                    switch (item.getItemId()) {

                    case R.id.font_20:

                            text_main_info.setTextSize(20);

                            break;

                    case R.id.font_30:

                            text_main_info.setTextSize(30);

                            break;

                    case R.id.font_red:

                            text_main_info.setTextColor(Color.RED);

                            break;

                    case R.id.font_green:

                            text_main_info.setTextColor(Color.GREEN);

                            break;

                    }

                    return super.onOptionsItemSelected(item);

            }

    三、ContextMenu  上下文菜单

    (一)、上下文菜单介绍:上下文菜单继承自android.view.Menu。

    1、上下文菜单与Options Menu最大的不同在于:

    • Options Menu的拥有者是Activity,而上下文菜单的拥有者是Activity中的View;
    • 每个Activity有且只有一个Options Menu,它为整个Activity服务。而一个Activity往往有多个View,哪个View需要上下文菜单就通过registerForContextMenu(View view)给这个View注册上下文菜单。

    2、生成上下文菜单是通过Activity中的onCreateContextMenu()方法:

    • onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)方法很像生成Options Menu的onCreateOptionsMenu(Menu menu)方法;
    • 两者的不同在于:onCreateOptionsMenu只在用户第一次按“Menu”键时被调用,而onCreateContextMenu会在用户每一次长按注册了上下文菜单的View时被调用。

    3ContextMenuInfo 有什么用呢?

    当视图元素需要向上下文菜单传递一些信息,比如该View对应DB记录的id等,这就要使用ContextMenuInfo。需要传递额外信息的View需要重写getContextMenuInfo()方法,返回一个带有数据的ContextMenuInfo实现类对象。

    Additional information regarding the creation of the context menu. For example, AdapterViews use this to pass the exact item position within the adapter that initiated the context menu.

    ContextMenuInfo携带了注册上下文菜单控件的一些额外信息。一般用在AdaterViews(例如:Spinner 、ListView或GridView)上,

    可以在ContextMenuInfo 中获取到适配器View中的position的信息

    (二)、开发上下文菜单的步骤:

    1、重写onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo)方法;
    2、调用Activity的registerForContextMenu(View view)方法为view组件注册上下文菜单;(注册上下文菜单后,意味着用户长按该控件后显示上下文菜单)。
    3、为菜单项提供响应,重写onContextItemSelected(MenuItem item)。

    四、PopupWindow  弹出式窗体菜单(自定义菜单):

    PopupWindow显示的方法有三个:

    • showAsDropDown(anchor)
    • showAsDropDown(anchor, xoff, yoff)
    • showAtLocation(parent, gravity, x, y)

    前两个showAsDropDown方法是让PopupWindow相对于某个控件显示,而showAtLocation是相对于整个窗口的。

    第一个参数是View类型的parent,虽然这里参数名是parent,其实,不是把PopupWindow放到这个parent里,并不要求这个parent是一个ViewGroup,这个参数名让人误解。官方文档”a parent view to get the android.view.View.getWindowToken() token from

    “,这个parent的作用应该是调用其getWindowToken()方法获取窗口的Token,所以,只要是该窗口上的控件就可以了。

    第二个参数是Gravity,可以使用|附加多个属性,如Gravity.LEFT|Gravity.BOTTOM。

    第三四个参数是x,y偏移。

  • 相关阅读:
    Oracle第一课
    Web前端试题
    E
    Kingdom of Black and White
    D. Let's Go Hiking
    2021牛客寒假 第一场
    Codeforces Round #691 (Div. 2)
    CF1461D
    CF1461B
    浙财16th校赛 F因子
  • 原文地址:https://www.cnblogs.com/weigongcheng/p/5886383.html
Copyright © 2011-2022 走看看