Android开发中Dialog对话框的使用

简介:

Dialog是android开发过程中最常用到的组件之一,它包括以下几种类型:

  警告对话框:Alertialog

  进度对话框:ProgressDialog

  日期选择对话框:DatePickerDialog

  时间选择对话框:TimePickerDialog

  自定义对话框:从Dialog继承

  Dialog的创建方式有两种:

  一是直接new一个Dialog对象,然后调用Dialog对象的show和dismiss方法来控制对话框的显示和隐藏。

  二是在Activity的onCreateDialog(int id)方法中创建Dialog对象并返回,然后调用Activty的showDialog(int id)和dismissDialog(int id)来显示和隐藏对话框。

  区别在于通过第二种方式创建的对话框会继承Activity的属性,比如获得Activity的menu事件等。

  使用AlertDialog可以创建普通对话框、带列表的对话框以及带单选按钮和多选按钮的对话框。

  普通对话框

  效果如下:

  

  代码:


// 创建builder
                AlertDialog.Builder builder 
=   new  AlertDialog.Builder(DialogSampleActivity.this);
                builder.setTitle(
" 普通对话框 " )     // 标题
                    .setIcon(R.drawable.ic_launcher)    
// icon
                    .setCancelable(
false )     // 不响应back按钮
                    .setMessage(
" 这是一个普通对话框 " )     // 对话框显示内容
                  
// 设置按钮
                    .setPositiveButton(
" 确定 " new  DialogInterface.OnClickListener() {
                        @Override
                        
public  void onClick(DialogInterface dialog,  int  which) {
                            Toast.makeText(DialogSampleActivity.this, 
" 点击了确定按钮 " , Toast.LENGTH_SHORT).show();
                        }
                    })
                    .setNeutralButton(
" 中立 " new  DialogInterface.OnClickListener() {                        
                        @Override
                        
public  void onClick(DialogInterface dialog,  int  which) {
                            Toast.makeText(DialogSampleActivity.this, 
" 点击了中立按钮 " , Toast.LENGTH_SHORT).show();
                        }
                    })
                    .setNegativeButton(
" 取消 " new  DialogInterface.OnClickListener() {                    
                        @Override
                        
public  void onClick(DialogInterface dialog,  int  which) {
                            Toast.makeText(DialogSampleActivity.this, 
" 点击了取消按钮 " , Toast.LENGTH_SHORT).show();
                        }
                    });
                
// 创建Dialog对象
                AlertDialog dlg 
=  builder.create();
                return dlg;

  带列表的对话框

  效果图:

  代码:

 final CharSequence[] items  =  {  " Item1 " " Item2 " " Item3 "  };
            
//  创建builder
            AlertDialog.Builder builder 
=   new  AlertDialog.Builder(
                    DialogSampleActivity.this);
            builder.setTitle(
" 列表对话框 " //  标题
                    .setIcon(R.drawable.ic_launcher) 
//  icon
                    .setCancelable(
false //  不响应back按钮
                    .setItems(items, 
new  DialogInterface.OnClickListener() {
                        @Override
                        
public  void onClick(DialogInterface dialog,  int  which) {
                            Toast.makeText(DialogSampleActivity.this,
                                    
" 选择了 "   +  items[which], Toast.LENGTH_SHORT)
                                    .show();
                        }
                    });
            
//  创建Dialog对象
            AlertDialog dlg 
=  builder.create();
            return dlg;

  带单选按钮的列表对话框

  只需将setItems替换为:

.setSingleChoiceItems(items,  - 1 new  DialogInterface.OnClickListener() {
                        @Override
                        
public  void onClick(DialogInterface dialog,  int  which) {
                            Toast.makeText(DialogSampleActivity.this,
                                    
" 选择了 "   +  items[which], Toast.LENGTH_SHORT)
                                    .show();
                        }
                    });

  这里多了一个参数-1,代表默认选中第几项,-1表示默认不选中

  带复选框的列表对话框

  只需将setItems替换为:


.setMultiChoiceItems(items, checked, 
new  DialogInterface.OnMultiChoiceClickListener() {        
                        @Override
                        
public  void onClick(DialogInterface dialog,  int  which,  boolean  isChecked) {
                            Toast.makeText(DialogSampleActivity.this,
                                    
" 选择了 "   +  items[which], Toast.LENGTH_SHORT)
                                    .show();
                        }
                    });

  参数checked伟boolean数组,表示默认哪些复选框是被选中的。

  另外,如果你想要获取list中哪些项是被选中的,你需要:

// 获得ListView
ListView list 
=  dlg.getListView();
// 判断第i项是否被选中,为真表示被选中,为假表示没有选中
list.getCheckedItemPositions().get(i)

  日期选择对话框

  效果图:

  代码:

Calendar calendar  =  Calendar.getInstance();
            DatePickerDialog.OnDateSetListener dateListener 
=    
                
new  DatePickerDialog.OnDateSetListener() {  
                    @Override  
                    
public  void onDateSet(DatePicker datePicker,   
                            
int   year int   month int  dayOfMonth) {  
                        Toast.makeText(DialogSampleActivity.this,
                                
year   +   " "   +  ( month + 1 +   " "   +  dayOfMonth  +   " " , Toast.LENGTH_SHORT)
                                .show();  
                    }
                };  
            DatePickerDialog dlg 
=   new  DatePickerDialog(
                    DialogSampleActivity.this,
                    dateListener,
                    calendar.get(Calendar.YEAR),
                    calendar.get(Calendar.MONTH),
                    calendar.get(Calendar.DAY_OF_MONTH));
            return dlg;

 

  时间选择对话框

  效果图:

  代码:

 Calendar calendar  =  Calendar.getInstance();
            TimePickerDialog.OnTimeSetListener timeListener 
=    
                
new  TimePickerDialog.OnTimeSetListener() {

                    @Override
                    
public  void onTimeSet(TimePicker timePicker,  int  hourOfDay,  int   minute ) {
                        Toast.makeText(DialogSampleActivity.this,
                                hourOfDay 
+   " : "   +   minute , Toast.LENGTH_SHORT).show();  
                    }  
                   
                };  
            TimePickerDialog dlg 
=   new  TimePickerDialog(
                    DialogSampleActivity.this,
                    timeListener,
                    calendar.get(Calendar.HOUR_OF_DAY),
                    calendar.get(Calendar.MINUTE),
                    
true );
            return dlg;

 

  自定义对话框

  效果图:

  步骤:

  1、创建对话框的布局文件

< ?xml version = " 1.0 "  encoding = " utf-8 " ? >
< RelativeLayout
    xmlns:android
= " http://schemas.android.com/apk/res/android "
      android:layout_width
= " wrap_content "
      android:layout_height
= " wrap_content " >
      
< ! --  标题栏  -->
      
< LinearLayout
          android:id
= " @+id/dlg_priority_titlebar "
          android:orientation
= " horizontal "
          android:layout_width
= " fill_parent "
          android:layout_height
= " wrap_content "
          android:layout_alignParentTop
= " true " >
          
< ImageView
            android:src
= " @drawable/star_gray "
            android:layout_width
= " wrap_content "
            android:layout_height
= " wrap_content "
            android:layout_margin
= " 5dip " />
        
< TextView
            android:layout_width
= " wrap_content "
            android:layout_height
= " wrap_content "
            android:text
= " 选择任务优先级 "
            android:layout_gravity
= " center_vertical " />
      
</ LinearLayout >
      
< ! --  任务优先级  -->
      
< ListView
          android:id
= " @+id/dlg_priority_lvw "
          android:layout_width
= " wrap_content "
          android:layout_height
= " wrap_content "
          android:layout_below
= " @id/dlg_priority_titlebar "
          android:background
= " @drawable/layout_home_bg " >
      
</ ListView >      
</ RelativeLayout >

  2、因为该布局中使用了自定义的ListView,所以再为ListView创建布局文件

< ?xml version = " 1.0 "  encoding = " utf-8 " ? >< LinearLayout    xmlns:android = " http://schemas.android.com/apk/res/android "     android:orientation = " horizontal "     android:layout_width = " fill_parent "     android:layout_height = " fill_parent "      >      < ImageView          android:id = " @+id/list_priority_img "           android:layout_width = " wrap_content "           android:layout_height = " wrap_content "           android:layout_gravity = " center_vertical "           android:layout_margin = " 5dip "                    />      < TextView         android:id = " @+id/list_priority_value "          android:layout_width = " wrap_content "          android:layout_height = " wrap_content "         android:layout_gravity = " center_vertical "          android:textSize = " 28dip "          android:textColor = " @drawable/black " /></ LinearLayout >

  3、创建自定义Dialog类PriorityDlg继承自Dialog

public  class PriorityDlg extends Dialog {
    
    
private  Context context;
    
private  ListView dlg_priority_lvw  =   null ;

    
public  PriorityDlg(Context context) {
        super(context);
        this.context 
=  context;
        
//  TODO Auto - generated constructor stub
    }
    
    
public  PriorityDlg(Context context,  int  theme) {
        super(context, theme);
        this.context 
=  context;
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        
//  TODO Auto - generated method stub
        super.onCreate(savedInstanceState);
      
// 设置对话框使用的布局文件
        this.setContentView(R.layout.dlg_priority);

        dlg_priority_lvw 
=  (ListView) findViewById(R.id.dlg_priority_lvw);

        
//  设置ListView的数据源
        SimpleAdapter adapter 
=   new  SimpleAdapter(context, getPriorityList(),
                R.layout.lvw_priority, 
new   String [] {  " list_priority_img " ,
                        
" list_priority_value "  },  new   int [] {
                        R.id.list_priority_img, R.id.list_priority_value });
        dlg_priority_lvw.setAdapter(adapter);

        
//  为ListView设置监听器
        dlg_priority_lvw
                .setOnItemClickListener(
new  AdapterView.OnItemClickListener() {

                    @Override
                    
public  void onItemClick(AdapterView < ? >  arg0, View arg1,
                            
int  arg2,  long  arg3) {

                    }
                });
    }

    
/**
     
*  得到ListView数据源
     
*  
     
*  @return
     
*/
    
private  List < HashMap < String Object >>  getPriorityList() {
        List
< HashMap < String Object >>  priorityList  =   new  ArrayList < HashMap < String Object >> ();
        HashMap
< String Object >  map1  =   new  HashMap < String Object > ();
        map1.put(
" list_priority_img " , R.drawable.priority_not_important);
        map1.put(
" list_priority_value " , context.getResources().getString(
                R.string.dlg_priority_not_important));
        priorityList.add(map1);
        HashMap
< String Object >  map2  =   new  HashMap < String Object > ();
        map2.put(
" list_priority_img " , R.drawable.priority_general);
        map2.put(
" list_priority_value " , context.getResources().getString(
                R.string.dlg_priority_general));
        priorityList.add(map2);
        HashMap
< String Object >  map3  =   new  HashMap < String Object > ();
        map3.put(
" list_priority_img " , R.drawable.priority_important);
        map3.put(
" list_priority_value " , context.getResources().getString(
                R.string.dlg_priority_important));
        priorityList.add(map3);
        HashMap
< String Object >  map4  =   new  HashMap < String Object > ();
        map4.put(
" list_priority_img " , R.drawable.priority_very_important);
        map4.put(
" list_priority_value " , context.getResources().getString(
                R.string.dlg_priority_very_important));
        priorityList.add(map4);

        return priorityList;
    }

}

  4、创建自定义对话框

PriorityDlg dlg  =   new  PriorityDlg(SimpleTaskActivity.this, R.style.dlg_priority);
return dlg;

  这里的R.style.dlg_priority设置了对话框使用的样式文件,只是让对话框去掉标题栏,当然你也可以通过代码来完成这种效果:

< ?xml version = " 1.0 "  encoding = " utf-8 " ? >< resources >      < ! --  对话框样式  -->      < style name = " dlg_priority " parent = " @android:Theme.Dialog " >          < item name = " android:windowNoTitle " > true </ item >      </ style ></ resources >

  到这里自定义对话框的创建就结束了,想要什么样子的对话框完全凭你自己的想像。










本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/wws5201985/736044,如需转载请自行联系原作者
目录
相关文章
|
2天前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
22 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
14天前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
115 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
12天前
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
35 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
27天前
|
缓存 前端开发 Android开发
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
76 12
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
|
1月前
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
36 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
2月前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
77 19
|
2月前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
173 3
|
Java Android开发 Kotlin
Android 自定义加载动画Dialog弹窗
Android 自定义加载动画Dialog弹窗
362 0
|
XML Android开发 数据格式
Android自定义Dialog以控制其位置和宽高
Android自定义Dialog以控制其位置和宽高
518 0
|
Android开发
android自定义相对复杂dialog
之前写了两篇关于Dialog的算是文章吧(2333),分别是: 1、 Android 系统原生dialog使用 2、 Android dialog Activity 使用 下面开始第三篇:相对复杂的自定义dialog。
1136 0

热门文章

最新文章

  • 1
    如何修复 Android 和 Windows 不支持视频编解码器的问题?
  • 2
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 3
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
  • 4
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 5
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
  • 6
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 7
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
  • 8
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 9
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 10
    Android学习自定义View(四)——继承控件(滑动时ListView的Item出现删除按钮)