Android对话框Dialog的基本用法

蔚落 2022-09-19 01:28 213阅读 0赞

AlertDialog的基本用法总结如下:

1.实例化dialog

  1. 由于AlertDialog的构造函数的关系,不能直接实例化,需要利用Builder来实例化,如
  2. AlertDialog ad=new AlertDialog.Builder(Main.this).create();

2.设置对话框

  1. 设置除了指基本设置如titlemessagesicon外,还指设置对话框的按钮,单选框,列表,复选框等。

3.show

  1. 显示对话框。

下面的代码片段展现了各种设置的用法:

1.确定和取消按钮

  1. //确定和取消按钮
  2. b1=(Button)findViewById(R.id.btn1);
  3. b1.setOnClickListener(new View.OnClickListener() {
  4. @SuppressWarnings("deprecation")
  5. @Override
  6. public void onClick(View v) {
  7. AlertDialog ad=new AlertDialog.Builder(MainActivity.this).create();
  8. ad.setTitle("标题1");
  9. ad.setIcon(R.drawable.ic_launcher);
  10. ad.setMessage("我是消息内容");
  11. ad.setButton("确定", new DialogInterface.OnClickListener() {
  12. @Override
  13. public void onClick(DialogInterface dialog, int which) {
  14. }
  15. });
  16. ad.setButton2("取消", new DialogInterface.OnClickListener() {
  17. @Override
  18. public void onClick(DialogInterface dialog, int which) {
  19. }
  20. });
  21. ad.show();
  22. }
  23. });

2.动态创建对话框

  1. //动态创建
  2. b3=(Button)findViewById(R.id.btn3);
  3. b3.setOnClickListener(new View.OnClickListener() {
  4. @SuppressWarnings("deprecation")
  5. @Override
  6. public void onClick(View v) {
  7. //创建布局
  8. LayoutInflater inflater=MainActivity.this.getLayoutInflater();
  9. View twoEditText=inflater.inflate(R.layout.twoedittext, null);
  10. //Activity.findViewById最终还是会调用View.findViewById
  11. //因为在Activity的onCreate中一定会先setContentView的
  12. final EditText e1=(EditText)twoEditText.findViewById(R.id.e1);
  13. final EditText e2=(EditText)twoEditText.findViewById(R.id.e2);
  14. e1.setText("e1");
  15. e2.setText("e2");
  16. //创建对话框
  17. AlertDialog ad=new AlertDialog.Builder(MainActivity.this).create();
  18. ad.setView(twoEditText);//将view填充至对话框中
  19. ad.setTitle("标题1");
  20. ad.setIcon(R.drawable.ic_launcher);
  21. ad.setMessage("动态创建的内容!");
  22. ad.setButton("取值", new DialogInterface.OnClickListener() {
  23. @Override
  24. public void onClick(DialogInterface dialog, int which) {
  25. Log.v("tag",e1.getText().toString()+e2.getText());
  26. }
  27. });
  28. ad.show();
  29. }
  30. });

这里将布局文件对应的View动态的加载至对话框中了(布局文件已提前建立了2个EditText),功能有扩展性。

3.单选列表

  1. //单选框
  2. b4=(Button)findViewById(R.id.btn4);
  3. b4.setOnClickListener(new View.OnClickListener() {
  4. @Override
  5. public void onClick(View v) {
  6. final String[] s={"a","b","c","d"};
  7. AlertDialog ad=new AlertDialog.Builder(MainActivity.this).
  8. setSingleChoiceItems(s, 1, new DialogInterface.OnClickListener() {
  9. @Override
  10. public void onClick(DialogInterface dialog, int which) {
  11. Log.v("tag", "您选中了"+s[which]);
  12. dialog.dismiss();
  13. }
  14. }).create();
  15. ad.show();
  16. }
  17. });

加入单选列表、复选等列表时,需要在builder后面调用setXXXX方法后再create的,一旦create后的实例对象是没有对应的setXXXX的方法的。

4.复选列表

  1. //复选框
  2. b5=(Button)findViewById(R.id.btn5);
  3. b5.setOnClickListener(new View.OnClickListener() {
  4. @SuppressWarnings("deprecation")
  5. @Override
  6. public void onClick(View v) {
  7. final String[] s={"a","b","c","d"};
  8. final AlertDialog ad=new AlertDialog.Builder(MainActivity.this)
  9. .setMultiChoiceItems(s, null, new OnMultiChoiceClickListener(){
  10. @Override
  11. public void onClick(DialogInterface dialog, int which,
  12. boolean isChecked) {
  13. Log.v("tag", "选中了第"+which+",值为"+isChecked);
  14. }
  15. }).create();
  16. //全选
  17. final boolean[] bArray=new boolean[]{true,false,true,true};
  18. ad.setButton("全选", new DialogInterface.OnClickListener() {
  19. @Override
  20. public void onClick(DialogInterface dialog, int which) {
  21. ListView lv=ad.getListView();
  22. for(int i=0;i<lv.getCount();i++){
  23. lv.setItemChecked(i, true);
  24. }
  25. try{
  26. Field f=ad.getClass().getSuperclass().getDeclaredField("mShowing");
  27. f.setAccessible(true);
  28. f.set(ad, false);
  29. }
  30. catch(Exception e){
  31. }
  32. }
  33. });
  34. //反选
  35. ad.setButton2("反选", new DialogInterface.OnClickListener() {
  36. @Override
  37. public void onClick(DialogInterface dialog, int which) {
  38. SparseBooleanArray sb=ad.getListView().getCheckedItemPositions();
  39. ListView lv=ad.getListView();
  40. for(int i=0;i<lv.getCount();i++){
  41. lv.setItemChecked(i, !sb.get(i));
  42. }
  43. try{
  44. Field f=ad.getClass().getSuperclass().getDeclaredField("mShowing");
  45. f.setAccessible(true);
  46. f.set(ad, false);
  47. }
  48. catch(Exception e){
  49. }
  50. }
  51. });
  52. //取值
  53. ad.setButton3("确定", new DialogInterface.OnClickListener() {
  54. @Override
  55. public void onClick(DialogInterface dialog, int which) {
  56. ListView lv=ad.getListView();
  57. for(int i=0;i<lv.getCount();i++){
  58. Log.v("tag","id:"+lv.getAdapter().getItemId(i)+"item:"+lv.getAdapter().getItem(i));
  59. }
  60. try{
  61. Field f=ad.getClass().getSuperclass().getDeclaredField("mShowing");
  62. f.setAccessible(true);
  63. f.set(ad, true);
  64. ad.dismiss();
  65. }
  66. catch(Exception e){
  67. }
  68. }
  69. });
  70. ad.show();
  71. //一定要show完之后在初始化
  72. for(int i=0;i<bArray.length;i++){
  73. ad.getListView().setItemChecked(i, bArray[i]);
  74. }
  75. }
  76. });

由于dialog默认是会dismiss掉的,但对于复选来说,只用待用户筛选完多个选项点击确认后才可消失。所以利用反射强行让其不消失:

  1. Field f=ad.getClass().getSuperclass().getDeclaredField("mShowing");
  2. f.setAccessible(true);
  3. f.set(ad, false);//false不消失,true消失

5.一般列表

  1. //普通列表
  2. b6=(Button)findViewById(R.id.btn6);
  3. b6.setOnClickListener(new View.OnClickListener() {
  4. @Override
  5. public void onClick(View v) {
  6. final String[] s={"q","w","s","d"};
  7. AlertDialog ad=new AlertDialog.Builder(MainActivity.this)
  8. .setItems(s, new DialogInterface.OnClickListener() {
  9. @Override
  10. public void onClick(DialogInterface dialog, int which) {
  11. Log.v("tag", "您选中了"+s[which]);
  12. dialog.dismiss();
  13. }
  14. }).create();
  15. ad.show();
  16. }
  17. });

代码下载http://download.csdn.net/detail/kkkkkxiaofei/6690817

发表评论

表情:
评论列表 (有 0 条评论,213人围观)

还没有评论,来说两句吧...

相关阅读