Android 对话框AlertDialog和AlertDialog.Builder两者的区别
2016-01-15 23:19
399 查看
AlertDialog也是Android系统当中最常用的对话框之一。 程序员可以给AlertDialog对话框设置相应的信息。比如title,massage,setSingleChoiceItems,setPositiveButton,setNegativeButton等等。。
但不能直接通过AlertDialog的构造函数来生产一个AlertDialog。查看源码发现AlertDialog所有的构造方法都是protected的。
AlertDialog构造方法源码如下:
所以为了获取AlertDialog对象,系统提供了一个静态内部类Builder让我们使用,通过Builder可以创建AlertDialog对象:
创建一个对话框的DEMO:
在上述DEMO中,我们先创建 AlertDialog的内部类Builder,然后给这个builder设置布局信息,如title,message。两个点击按钮并分别为两个按钮设置监听等。
如上DEMO中我们既使用了AlertDialog.Builder又使用了AlertDialog,其实在如上使用了系统提供的默认布局中只使用AlertDialog.Builder而不是创建AlertDialog的实例也可以完成显示。
两个执行的执行效果一模一样。现在我们不使用系统提供的布局,我们显示一个自定义布局的对话框。
这个布局文件比较简单,此处不再给出。
结论:
如果使用系统默认的布局创建对话框则单独使用AlertDialog.Builder即可无需通过其create()创建AlertDialog而如果使用自定义的对话框则必须使用AlertDialog.Builder的create方法来创建AlertDialog东西创建对话框。
但不能直接通过AlertDialog的构造函数来生产一个AlertDialog。查看源码发现AlertDialog所有的构造方法都是protected的。
AlertDialog构造方法源码如下:
[code] protected AlertDialog(Context context) { super((Context)null, false, (OnCancelListener)null); throw new RuntimeException("Stub!"); } protected AlertDialog(Context context, boolean cancelable, OnCancelListener cancelListener) { super((Context)null, false, (OnCancelListener)null); throw new RuntimeException("Stub!"); } protected AlertDialog(Context context, int themeResId) { super((Context)null, false, (OnCancelListener)null); throw new RuntimeException("Stub!"); }
所以为了获取AlertDialog对象,系统提供了一个静态内部类Builder让我们使用,通过Builder可以创建AlertDialog对象:
[code] AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); AlertDialog dialog = builder.create();
创建一个对话框的DEMO:
[code]private AlertDialog dialog; public void showDialogue(View view){ AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("删除信息"); builder.setMessage("确定删除吗?"); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { Toast.makeText(MainActivity.this, "你点击了确定", Toast.LENGTH_LONG).show(); dialog.dismiss(); } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { Toast.makeText(MainActivity.this,"你点击了取消",Toast.LENGTH_LONG).show(); dialog.dismiss(); } }); dialog = builder.create(); dialog.show(); }
在上述DEMO中,我们先创建 AlertDialog的内部类Builder,然后给这个builder设置布局信息,如title,message。两个点击按钮并分别为两个按钮设置监听等。
如上DEMO中我们既使用了AlertDialog.Builder又使用了AlertDialog,其实在如上使用了系统提供的默认布局中只使用AlertDialog.Builder而不是创建AlertDialog的实例也可以完成显示。
[code]public void showDialogue(View view){ final AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("删除信息"); builder.setMessage("确定删除吗?"); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { Toast.makeText(MainActivity.this, "你点击了确定了", Toast.LENGTH_LONG).show(); // dialog.dismiss(); } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { Toast.makeText(MainActivity.this, "你点击了取消了", Toast.LENGTH_LONG).show(); //dialog.dismiss(); } }); builder.show(); /*dialog = builder.create(); dialog.show();*/ }
两个执行的执行效果一模一样。现在我们不使用系统提供的布局,我们显示一个自定义布局的对话框。
[code] AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); dialog = builder.create(); //将自定义的布局设置给AlertDialog View view = View.inflate(UiUtils.getContext(), R.layout.updategroup, null); dialog.setView(view); //获取布局中的按钮并设置这个自定义布局的监听 Button button = (Button) view.findViewById(R.id.update_ok); final EditText editText = (EditText) view.findViewById(R.id.new_group_name); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //自定义布局中按钮的点击事件 } }); //i显示自定义布局对话框 dialog.show(); }
这个布局文件比较简单,此处不再给出。
结论:
如果使用系统默认的布局创建对话框则单独使用AlertDialog.Builder即可无需通过其create()创建AlertDialog而如果使用自定义的对话框则必须使用AlertDialog.Builder的create方法来创建AlertDialog东西创建对话框。
相关文章推荐
- Handler、MessageQueue、Runnable与Looper的源码浅析
- 尝试使用request.getRemoteAddr()时获得ipv6地址:0.0.0.0.0.0.0.1的解决方法
- mongoVUE1.5完全破解版赠送
- UI_Label标签属性
- Implement Stack using Queues leetcode
- UI_2
- UI_1
- UI_视图界面
- String、StringBuffer和StringBuilder的区别
- 自定义视图与工厂模式
- IOS动画中的枚举UIViewAnimationOptions
- Android界面设计的4种方式之二——在Java代码中控制UI界面
- 【leetcode】100. Same Tree My Submissions Question
- query specified join fetching, but the owner of the fetched association was not present in the select list
- Android开发出现Warning:Gradle version 2.10 is required. Current version is 2.8. If u
- 【Codeforces 570D 】Tree Requests dfs序+二分
- iOS 【关于几个常用UIColor宏定义】
- Animation动画详解(四)——ValueAnimator基本使用
- 【UEditor】百度UE富文本自定义按钮添加文本
- Android UI之ImageSwitcher && TextSwitcher 实现图文翻页