多选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
- 多选AlertDialog至多选择3项
- AlertDialog实现菜单项选择的事件
- AlertDialog 对话框 二或三选择项
- Android AlertDialog 选择列表
- Android--选择对话框--AlertDialog
- AlertDialog选择对话框
- js前端动态上传至多3对文件
- 安卓AlertDialog进阶使用实现日期选择、单选、多选。
- android之具有选择功能的AlertDialog
- AlertDialog的嵌套--可以选择的对话框
- AlertDialog.Builder弹窗强制选择效果
- AlertDialog
- AlertDialog
- AlertDialog
- AlertDialog
- AlertDialog
- AlertDialog
- AlertDialog
- java解惑之陷阱和缺陷的目录总结
- linux adb无法连接的问题
- 阿里2015年4月实习生招聘研发岗笔试题——RPC题解
- 基于Lockset的数据竞争检测方法汇总(二)
- 记事本在读取一个文本时如何判断是该用啥字符集来读取解析文本字符
- 多选AlertDialog至多选择3项
- C++的构造、析构函数
- 网页刷新或者重新加载后滚动条的位置不变
- 浅谈10个重要的Linux ps命令
- 黑马程序员——Java基础:面向对象一些概念的区分(二)
- 字符串读入和输出问题
- Ubuntu14.04安装搜狗输入法
- UML图
- i=i++分析