Android用户界面之(Dialog)对话框
在Android中,启动一个对话框有三种方式:
1、定义一个新的activity,并将其主题设置为对话框风格
2、使用AlertDialog类,并且显示它
3、使用 Android的Dialog类的子类,并且显示它
现在学习AlertDialog.Builder创建各种形式的对话框。
用土司来显示效果,因为多次用到,所以将其抽象为一个方法。
protected void showToast(String string) { Toast.makeText(this, string, Toast.LENGTH_SHORT).show(); }
1.提示对话框
public void onClick(View v) { switch (v.getId()) { case R.id.button1: new AlertDialog.Builder(this) .setTitle("这是一个最简单的对话框") .setIcon(R.drawable.img1) .setMessage("你好!!!") .setPositiveButton("开始", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { DialogActivity.this.showToast("你点击了开始按钮 "+ which); } }) .setNeutralButton("暂停", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { DialogActivity.this.showToast("你点击了暂停按钮 "+ which); } }) .setNegativeButton("退出", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { DialogActivity.this.showToast("你点击了退出按钮 " + which); } }).show(); break;
2.列表对话框
对于这个对话框,我们用到了这个方法
setItem(),即将setMessage改成这个方法就可以了。
代码如下:其中items是一个成员变量。final String[] items = {"开始","暂停","退出"};
case R.id.button2: new AlertDialog.Builder(this) .setTitle("选项列表对话框") .setIcon(R.drawable.img2) //items的第一个参数也可以接受itemID,所以可写在xml文件中 .setItems(items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { DialogActivity.this.showToast("你点击了按钮 " + items[which]); } }).show(); break;
3.单选列表对话框
case R.id.button3: new AlertDialog.Builder(this) .setTitle("带单选框的列表对话框") .setIcon(R.drawable.img3) //setSingleChoiceItems()的第二个参数是设置默认选项,选项索引从0开始,-1代表不选择任何选项。 .setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { DialogActivity.this.showToast("你点击了按钮 " + items[which]); //需调用这个方法,使点击后对话框消失,不然一直不会消失的 dialog.cancel(); } }).create().show(); break;
4.多选列表话框
case R.id.button4: new AlertDialog.Builder(this) .setTitle("你的爱好有:") .setIcon(R.drawable.img3) .setMultiChoiceItems(R.array.string_array_name, null, new DialogInterface.OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { String[] array = DialogActivity.this.getResources().getStringArray(R.array.string_array_name); String str; if(isChecked) { number++; }else { number--; } DialogActivity.this.showToast(array[which] + (isChecked ?" 选中了":" 取消了") ); } }) .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { DialogActivity.this.showToast("你一共选择了 "+ number + "项"); } }).show(); break;
这次,并没有直接用数组,而是在strings.xml中定义的一个数组资源
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="string_array_name"> <item>健美操</item> <item>跳舞</item> <item>跑步</item> </string-array> </resources>
5.自定义对话框
setView(view)方法来显示登录框。接受的参数为View(view,editText的组合),以LayoutInflater来实现。
要得到LayoutInflater(布局泵),只需要调用
LayoutInflater inflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
我们用inflater .inflater()用来找layout下xml布局文件,并且实例化。
类似于findVIewbyID,区别是一个得到整个布局,一个得到单个的组件。
代码如下:
case R.id.button5: LayoutInflater inflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.dialog, null); new AlertDialog.Builder(this) .setTitle("登陆框") .setIcon(R.drawable.img4) .setView(view) .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { DialogActivity.this.showToast("正在登录,请稍后。。。"); } }).show();
res/layout/dialog.xml布局为两个TextView,两个EditText,如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android" Android:layout_width="fill_parent" Android:layout_height="fill_parent" Android:orientation="vertical"> <TextView Android:layout_width="wrap_content" Android:layout_height="wrap_content" Android:text="账号" /> <EditText Android:layout_width="fill_parent" Android:layout_height="wrap_content" Android:id="@+id/username" /> <TextView Android:layout_width="wrap_content" Android:layout_height="wrap_content" Android:text="密码" /> <EditText Android:layout_width="fill_parent" Android:layout_height="wrap_content" Android:id="@+id/password" /> </LinearLayout>