Android复习之旅--简单使用Dialog

对话框在Android中的应用场景也是不少的,例如删除、支付等重要的操做,须要提醒用户是否继续,这样很好的提升了用户的体验javascript

这里总结了Android中经常使用的对话框,虽然只是旧版本的,但当作参考也差很少足够了java

对话框是提示用户做出决定或输入额外信息的小窗口。 对话框不会填充屏幕,一般用于须要用户采起行动才能继续执行的模式事件android

Dialog

由于布局文件太简单这里就不展示出来了,省得占空间影响阅读编程

这里引入一个优化代码的理念:就是当一个布局下的子控件都要响应相同的事件或者执行相同的方法,能够经过布局对象获取到子控件,经过循环来对每个子控件进行操做,这样既减小了代码量,也提升了应用的性能。 感受本身表达能力欠佳,具体仍是看代码吧数组

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,哈哈,好尴尬啊app

@Override
public void onClick(View v) {
    // 优化
    showDialog(v.getId());
}复制代码

重载父类的方法,经过onCreateDialog()方法初始化每一个Dialog,并返回Dialog对象提供给showDialog()方法显示出来ide

@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...好像能够了,嗯就是这样

自定义对话框

/** * 一、建立一个Dialog对象,而且设置对话框的主题(样式) * 二、设置对话框显示的视图界面 * 三、对输入对话框的肯定按钮添加点击监听,当点击该按钮后,输入用户输入的数据 */
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去写呢,由于我不会啊。

由于拖延症,我尚未去学呢
好吧我又找借口了,其实就是懒(内心默默地流泪)

但愿对大家会有所帮助

相关文章
相关标签/搜索