多选AlertDialog至多选择3项

来源:互联网 发布:加载寄售物品数据库 编辑:程序博客网 时间:2024/06/11 21:03

多选AlertDialog至多选择3项

上一期的需求需要做一个AlterDialog,最多可以选择3项item;
先是 用自定义diaglog,在dialog中添加listview,可以实现至多选择3项,但是 选择item时有一定的延迟性,不太满意。后来慢慢尝试,在AlterDialog中setMultiChoiceItems即可实现至多选择三项。代码很简单,希望对大家有所帮助吧,觉得自带的AlterDialog比较丑的可以自己定义一个Dialog美化一下。
先把工程的文件贴一下:

Src

MultiChoiceActivity

layout

activity_multi_choice.xml

MultiChoiceActivity

package com.example.xx;import java.lang.reflect.Field;import java.util.ArrayList;import android.app.Activity;import android.app.AlertDialog;import android.content.Context;import android.content.DialogInterface;import android.content.DialogInterface.OnMultiChoiceClickListener;import android.os.Bundle;import android.view.KeyEvent;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Switch;import android.widget.TextView;import android.widget.Toast;public class MultiChoiceActivity extends Activity implements OnClickListener {    private TextView tv_selected;    private Button btn_choice;    private String[] mData;    private boolean[] ischecked;    int length = 10;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_multi_choice);        InitViews();        InitDatas();        registerListener();    }    private void InitDatas() {        // TODO Auto-generated method stub        mData = new String[10];        for (int i = 0; i < mData.length; i++) {            mData[i] = "item" + i;        }        ischecked = new boolean[mData.length];    }    private void registerListener() {        // TODO Auto-generated method stub        btn_choice.setOnClickListener(listener);    }    private void InitViews() {        // TODO Auto-generated method stub        tv_selected = (TextView) findViewById(R.id.tv_selected);        btn_choice = (Button) findViewById(R.id.btn_dialog);    }    OnClickListener listener = new OnClickListener() {        @Override        public void onClick(View v) {            // TODO Auto-generated method stub            switch (v.getId()) {            case R.id.btn_dialog:                final AlertDialog dialog_builder = new AlertDialog.Builder(                        MultiChoiceActivity.this)                        .setTitle("最多可选择3项")                        .setMultiChoiceItems(mData, ischecked,                                new OnMultiChoiceClickListener() {                                    @Override                                    public void onClick(DialogInterface dialog,                                            int which, boolean isChecked) {                                        ischecked[which] = isChecked;                                    }                                })                        .setPositiveButton("确定",                                new DialogInterface.OnClickListener() {                                    @Override                                    public void onClick(DialogInterface dialog,                                            int which) {                                        String s = "";                                        int num = 0;                                        for (int i = 0; i < length; i++) {                                            if (ischecked[i]) {                                                num++;                                                s += mData[i] + " ";                                            }                                        }                                        if (num <= 3) {                                            tv_selected.setText(s);                                            // tv_zone_feature.setText(s);                                            // feature_selected = s;                                            try {                                                Field field = dialog                                                        .getClass()                                                        .getSuperclass()                                                        .getDeclaredField(                                                                "mShowing");                                                field.setAccessible(true);                                                // 将mShowing变量设为false,表示对话框已关闭                                                field.set(dialog, true);                                                dialog.dismiss();                                            } catch (Exception e) {                                            }                                        } else {                                            Toast.makeText(                                                    MultiChoiceActivity.this,                                                    "最多可选择3项",                                                    Toast.LENGTH_LONG).show();                                            try {                                                Field field = dialog                                                        .getClass()                                                        .getSuperclass()                                                        .getDeclaredField(                                                                "mShowing");                                                field.setAccessible(true);                                                // 将mShowing变量设为false,表示对话框已关闭                                                field.set(dialog, false);                                                dialog.dismiss();                                            } catch (Exception e) {                                            }                                        }                                        // 扫描所有的列表项,如果当前列表项被选中,将列表项的文本追加到s变量中。                                    }                                })                        .setNegativeButton("取消",                                new DialogInterface.OnClickListener() {                                    @Override                                    public void onClick(DialogInterface dialog,                                            int which) {                                        // TODO Auto-generated method stub                                        try {                                            Field field = dialog                                                    .getClass()                                                    .getSuperclass()                                                    .getDeclaredField(                                                            "mShowing");                                            field.setAccessible(true);                                            // 将mShowing变量设为false,表示对话框已关闭                                            field.set(dialog, true);                                            dialog.dismiss();                                        } catch (Exception e) {                                        }                                    }                                })                        .setOnKeyListener(new DialogInterface.OnKeyListener() {                            @Override                            public boolean onKey(DialogInterface dialog,                                    int keyCode, KeyEvent event) {                                if (keyCode == KeyEvent.KEYCODE_BACK) {                                    try {                                        Field field = dialog.getClass()                                                .getSuperclass()                                                .getDeclaredField("mShowing");                                        field.setAccessible(true);                                        // 将mShowing变量设为false,表示对话框已关闭                                        field.set(dialog, true);                                        dialog.dismiss();                                    } catch (Exception e) {                                    }                                    return true;                                } else {                                    try {                                        Field field = dialog.getClass()                                                .getSuperclass()                                                .getDeclaredField("mShowing");                                        field.setAccessible(true);                                        // 将mShowing变量设为false,表示对话框已关闭                                        field.set(dialog, true);                                        dialog.dismiss();                                    } catch (Exception e) {                                    }                                    return false; // 默认返回                                                    // false,这里false不能屏蔽返回键,改成true就可以了                                }                            }                        }).setCancelable(true).create();                dialog_builder.show();                break;            default:                break;            }        }    };    @Override    public void onClick(View v) {        // TODO Auto-generated method stub    }}

其中这段代码

setMultiChoiceItems(mData, ischecked,                                new OnMultiChoiceClickListener() {                                    @Override                                    public void onClick(DialogInterface dialog,                                            int which, boolean isChecked) {                                        ischecked[which] = isChecked;                                    }                                })```这里的代码定义一个isChecked布尔数组来记录 每一项item是否被选中。其中最重要的代码块是<div class="se-preview-section-delimiter"></div>```javaString s = "";int num = 0;for (int i = 0; i < length; i++) {    if (ischecked[i]) {        num++;        s += mData[i] + " ";}}    if (num <= 3) {        tv_selected.setText(s);    } else {        Toast.makeText(MultiChoiceActivity.this,"最多可选择3项",Toast.LENGTH_LONG).show();}                               }                            })

这里点击确定按钮 ,检测已选择的item是否超过3项”最多可选择3项”,超过3项则toast;没有超过3项即可 获得已经选择的ietm的内容;
关于这段代码

try {            Field field = dialog.getClass().getSuperclass()                    .getDeclaredField("mShowing");            field.setAccessible(true);            // 将mShowing变量设为false,表示对话框已关闭            field.set(dialog, false);            dialog.dismiss();        } catch (Exception e) {        }

这里是为了防止,弹出AlterDialog以后,只能用“确定”和“取消”按钮来控制dialog的关闭,无法使用 手机的 “back”键;以后如果大家用到diaglog时无法使用返回键时,即可使用此段代码来激活“back”键。

activity_multi_choice.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <TextView         android:id="@+id/tv_selected"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:textSize="18sp"        android:gravity="center"        android:textColor="#666666"/>    <Button         android:id="@+id/btn_dialog"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="@string/btn_choice"        android:textSize="18sp"        android:textColor="@color/red"/></LinearLayout>
0 0
原创粉丝点击