Androind 对话框 1

一、标题、消息、按钮


首先我们要知识一个函数:

AlertDialog.Builder builder = new AlertDialog.Builder(context);   

这个AlertDialog.Builder(context)就是用来构建Dialog各种相关参数的,跟StringBuilder的含义差不多,在全部想要的参数都添加上完了以后,调用:
Builder.create()来创建对话框,使用Builder.show()来显示对话框。
Builder.create();  
Builder.show();  

对话框的构建与显示大致就是这个样子,下面让我们来看看AlertDialog.Builder(context);的各种参数;

1、ICON、标题与消息

先看看对话框中ICON、标题与消息各自的位置:


添加他们的代码分别是:
builder.setIcon(R.drawable.ic_launcher);//添加ICON
builder.setTitle("退出");                //添加标题
builder.setMessage("你确定要离开吗?");     //添加MSG

所以要构建上图的对对话框的完整代码是这样的:
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);  
builder.setIcon(R.drawable.ic_launcher);//添加ICON  
builder.setTitle("退出");                //添加标题  
builder.setMessage("你确定要离开吗?");     //添加MSG  
builder.create();  
builder.show(); 



2、按钮

google为我们提供了三个按钮选择,左按钮,右按钮和中间按钮,分别对应:
Builder.setPositiveButton(string,DialogInterface.OnClickListener);//确定按钮  
Builder.setNegativeButton(string,DialogInterface.OnClickListener);//取消按钮  
Builder.setNeutralButton(string,DialogInterface.OnClickListener);//中间按钮  

这里需要注意的是,中间按钮(setNeutralButton)无论把它放在代码的什么位置,他始终是在中间的,跟代码的具体位置无关,其实这个几按钮函数的代码的按钮位置跟他们的代码位置是都没有关系的,并不会因为在代码中先写了确定按钮,在显示时确定按钮就在左边,不是这样的,它是跟系统样式相关联的,系统样式中定义的确定按钮在哪边显示它就会在哪边显示!

看一下他们具体使用:
builder.setPositiveButton("确定",new DialogInterface.OnClickListener() {  
            public void onClick(DialogInterface dialog,int whichButton) {  
                // 点击响应  
                Toast.makeText(MainActivity.this, "ok click",Toast.LENGTH_LONG).show();  
            }  
        });  
builder.setNegativeButton("取消",new DialogInterface.OnClickListener() {  
            public void onClick(DialogInterface dialog,int whichButton) {  
                // 点击响应  
                Toast.makeText(MainActivity.this,"cancel click", Toast.LENGTH_LONG).show();  
            }  
        });  
builder.setNeutralButton("中间BTN",new DialogInterface.OnClickListener() {  
            public void onClick(DialogInterface dialog,int whichButton) {  
                // 点击响应  
                Toast.makeText(MainActivity.this,"center click", Toast.LENGTH_LONG).show();  
            }  
        });  

我们在每次点击时都弹一个Tost出来,完整的代码应当是这样的:
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);  
builder.setIcon(R.drawable.ic_launcher);//添加ICON  
builder.setTitle("退出");                //添加标题  
builder.setMessage("你确定要离开吗?");     //添加MSG  
  
builder.setPositiveButton("确定",new DialogInterface.OnClickListener() {  
            public void onClick(DialogInterface dialog,int whichButton) {  
                // 点击响应  
                Toast.makeText(MainActivity.this, "ok click",Toast.LENGTH_LONG).show();  
            }  
        });  
builder.setNegativeButton("取消",new DialogInterface.OnClickListener() {  
            public void onClick(DialogInterface dialog,int whichButton) {  
                // 点击响应  
                Toast.makeText(MainActivity.this,"cancel click", Toast.LENGTH_LONG).show();  
            }  
        });  
builder.setNeutralButton("中间BTN",new DialogInterface.OnClickListener() {  
            public void onClick(DialogInterface dialog,int whichButton) {  
                // 点击响应  
                Toast.makeText(MainActivity.this,"center click", Toast.LENGTH_LONG).show();  
            }  
        });  
builder.create();  
builder.show();  


效果是这样的:

在这里可以看出,在代码中我们先写的确定按钮,而最左边确是取消按钮,所以按钮的显示位置只与系统样式有关,而与代码中哪个提前写没有任何关系。

细心的同学可能会看到在DialogInterface.OnClickListener()的(DialogInterface dialog,int whichButton) {}中有两个参数,第一个是当前的Dialog,第二个是表示当前点击的哪个按钮的which,在这里我们用不到witchButton这个参数,因为我们直接在每个按钮的响应部位添加了响应代码,如果我们在整个类中添加实现了DialogInterface.OnClickListener()接口,那我们在做出点击响应时就应该判断当前是哪个按钮点击了,这三个按钮的ID分别对应:

BUTTON_POSITIVE   //确定按钮
BUTTON_NEGATIVE   //取消按钮
BUTTON_NEUTRAL     //中间按钮

上面说的那些东东的意思是这样的:

public class MainActivity extends Activity implements DialogInterface.OnClickListener {  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
          
        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);  
        builder.setPositiveButton("确定",this);  
        builder.setNegativeButton("取消",this);  
        builder.setNeutralButton("中间BTN",this);  
        builder.create();  
        builder.show();  
  
    }  
  
    @Override  
    public void onClick(DialogInterface dialog, int which) {  
        // TODO Auto-generated method stub  
        switch (which) {  
        case DialogInterface.BUTTON_POSITIVE:  
            //todo 确定按钮响应  
            break;  
        case DialogInterface.BUTTON_NEGATIVE:  
            //todo 取消按钮响应  
            break;  
        case DialogInterface.BUTTON_NEUTRAL:  
            //todo 中间按钮响应  
            break;  
        default:  
            break;  
        }  
    }  

这里在一个Activity中继承了DialogInterface.OnClickListener接口,我们在Builder.setpositiveButton的时候直接将监听函数设为this,所以在响应的时候要判断当前是哪个按钮过来的,这种方法很少使用,这里只是简单说一下DialogInterface.OnClickListener()中witch的含义及用法。
到这里,我们就讲完了,一个对话框应具有的几个基本属性,下面我们看看如果我想加个ImageView,TextView等等的布局要怎么办?下面就是自定义布局的部分了。

二、自定义布局

在AlertDialog中是允许我们传入我们自己的布局视图的,只需要将我们的View通过
Builder.setView(view);  

设置进去就可以了,下面就是我们如何构建我们的视图的问题了,这里提供两种方法,静态构建和动态构建;

1、静态构建布局

首先,我们可以随意写一个Layout文件,比如下面这个:(custom_view.xml)
<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:id="@+id/custom_view_root"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="horizontal" >  
    <ImageView   
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:src="@drawable/dog"/>  
    <TextView   
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:textSize="20sp"  
        android:text="小狗狗的照片"/>  
      
  
</LinearLayout>  

视觉是这样的:

在布局写好之后,通过下面LayoutInflater就可以得到他的View对象,然后通过Builder.setView(view)设置进Dialog:

LayoutInflater inflater = getLayoutInflater();  
View view = inflater.inflate(R.layout.custom_view, null);  
builder.setView(view);  

下面我们就完整的写下这段代码,给Dialog添加上ICON,标题,MSG和View,按钮就不加了,因为代码太多,影响解读
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);  
builder.setIcon(R.drawable.ic_launcher);//添加ICON  
builder.setTitle("退出");                //添加标题  
builder.setMessage("你确定要离开吗?");     //添加MSG  
  
LayoutInflater inflater = getLayoutInflater();  
View view = inflater.inflate(R.layout.custom_view, null);  
  
builder.setView(view);//添加自定义View  
builder.create();  
builder.show();

出来的效果是这样的:



2、动态构建布局


现在我们要用代码来动态构建一个与上一个小狗狗相同的布局,有关动态创建布局,我以前写过两篇博客,大家可以参考一下《动态添加控件及将某XML动态加入到Activity显示》《动态添加综合布局---动态添加控件及将某XML动态加入到Activity显示(续)》

在构建完布局,直接通过Builder.setView(root_lin),将布局的根结点设置进去就可以了,完整的代码如下:
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);  
builder.setIcon(R.drawable.ic_launcher);//添加ICON  
builder.setTitle("退出");                //添加标题  
builder.setMessage("你确定要离开吗?");     //添加MSG  
  
LinearLayout root_lin=new LinearLayout(MainActivity.this);    
root_lin.setOrientation(LinearLayout.HORIZONTAL);    
LinearLayout.LayoutParams LP_FW = new LinearLayout.LayoutParams(    
LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);   
root_lin.setLayoutParams(LP_FW);  
  
ImageView imageView = new ImageView(MainActivity.this);  
imageView.setImageResource(R.drawable.dog);  
imageView.setLayoutParams(LP_FW);  
root_lin.addView(imageView);  
  
TextView tv = new TextView(MainActivity.this);    
tv.setText("可爱的狗狗");    
tv.setTextSize(20);    
tv.setLayoutParams(LP_FW);    
root_lin.addView(tv);   
  
builder.setView(root_lin);  
builder.create();  
builder.show();  

效果与上一个图一样,就不贴了。

好了,这篇到这就结束了,下篇给大家说说有关ListView的Dialog的东东。


请大家尊重原创者版权,转载请标明出处: http://blog.csdn.net/harvic880925/article/details/42261419     谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值