Android 自定义dialog

my_dialog.xml布局文件:

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="
http://schemas.android.com/apk/res/android
"  
    android:orientation="vertical"   
    android:layout_width="fill_parent"  
    android:layout_height="wrap_content"  
    android:minWidth="280dip"  
    android:background="#FFFFFFFF">  
       
    <TextView  
        android:id="@+id/dialog_title"  
        android:layout_width="fill_parent"  
        android:layout_height="40.0dip"  
        android:gravity="center_vertical"  
        android:paddingLeft="10.0dip"  
        android:text="@string/dialog_title"  
        android:textSize="20dip"  
        android:textStyle="bold"  
        android:textColor="#0087CB"/>  
       
    <ImageView  
        android:layout_height="wrap_content"  
        android:layout_width="fill_parent"  
        android:background="@drawable/dialog_sparator"/>  
       
    <LinearLayout   
        android:id="@+id/dialog_content"  
        android:orientation="vertical"  
        android:layout_height="wrap_content"  
        android:layout_width="fill_parent">  
        <TextView  
            android:id="@+id/dialog_message"  
            android:layout_width="fill_parent"  
            android:layout_height="50.0dip"  
            android:gravity="center_vertical"  
            android:paddingLeft="10dip"  
            android:text="@string/dialog_msg"  
            android:textSize="20dip"  
            android:textStyle="bold"  
            android:textColor="#707070"/>  
    </LinearLayout>  
       
    <LinearLayout  
        android:orientation="horizontal"  
        android:layout_width="fill_parent"  
        android:layout_height="50.0dip"  
        android:layout_alignParentTop="true"  
        android:gravity="center">  
        <Button  
            android:id="@+id/dialog_back"  
            android:layout_width="120dip"  
            android:layout_height="wrap_content"  
            android:layout_marginRight="5dip"  
            android:text="@string/dialog_back"  
            android:textSize="20dip"  
            android:textColor="#ffffff"  
            android:textStyle="bold"  
            android:background="@drawable/dlg_bckbtn_selector"/>  
        <Button  
            android:id="@+id/dialog_confirm"  
            android:layout_width="120dip"  
            android:layout_height="wrap_content"  
            android:layout_marginLeft="5dip"  
            android:text="@string/dialog_exit"  
            android:textSize="20dip"  
            android:textColor="#ffffff"  
            android:textStyle="bold"  
            android:background="@drawable/dlg_cfgrmbtn_selector"/>  
    </LinearLayout>  
               
</LinearLayout>

定义Dialog的样式(主题):

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

自定义Dialog的Java代码:

import android.app.Dialog;  
import android.content.Context;  
import android.content.DialogInterface;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.ViewGroup.LayoutParams;  
import android.widget.Button;  
import android.widget.LinearLayout;  
import android.widget.TextView;  
    
   
public class MyDialog extends Dialog {  
    
    public MyDialog(Context context, int theme) {  
        super(context, theme);  
    }  
    
    public MyDialog(Context context) {  
        super(context);  
    }  
    
    /** 
     * Helper class for creating a custom dialog 
     */  
    public static class Builder {  
        private Context context;  
        private String title; // 对话框标题  
        private String message; // 对话框内容  
        private String backButtonText; // 对话框返回按钮文本  
        private String confirmButtonText; // 对话框确定文本  
        private View contentView;  
    
        // 对话框按钮监听事件  
        private DialogInterface.OnClickListener   
                        backButtonClickListener,  
                        confirmButtonClickListener;  
    
        public Builder(Context context) {  
            this.context = context;  
        }  
    
        /** 
         * 使用字符串设置对话框消息 
         * @param title 
         * @return 
         */  
        public Builder setMessage(String message) {  
            this.message = message;  
            return this;  
        }  
    
        /** 
         * 使用资源设置对话框消息 
         * @param title 
         * @return 
         */  
        public Builder setMessage(int message) {  
            this.message = (String) context.getText(message);  
            return this;  
        }  
    
        /** 
         * 使用资源设置对话框标题信息 
         * @param title 
         * @return 
         */  
        public Builder setTitle(int title) {  
            this.title = (String) context.getText(title);  
            return this;  
        }  
    
        /** 
         * 使用字符串设置对话框标题信息 
         * @param title 
         * @return 
         */  
        public Builder setTitle(String title) {  
            this.title = title;  
            return this;  
        }  
    
        /** 
         * 设置自定义的对话框内容 
         * @param v 
         * @return 
         */  
        public Builder setContentView(View v) {  
            this.contentView = v;  
            return this;  
        }  
    
        /** 
         * 设置back按钮的事件和文本 
         * @param backButtonText 
         * @param listener 
         * @return 
         */  
        public Builder setBackButton(int backButtonText, DialogInterface.OnClickListener listener) {  
            this.backButtonText = (String)context.getText(backButtonText);  
            this.backButtonClickListener = listener;  
            return this;  
        }  
    
        /** 
         * 设置back按钮的事件和文本 
         * @param backButtonText 
         * @param listener 
         * @return 
         */  
        public Builder setBackButton(String backButtonText, DialogInterface.OnClickListener listener) {  
            this.backButtonText = backButtonText;  
            this.backButtonClickListener = listener;  
            return this;  
        }  
    
        /** 
         * 设置确定按钮事件和文本 
         * @param confirmButtonText 
         * @param listener 
         * @return 
         */  
        public Builder setConfirmButton(int confirmButtonText, DialogInterface.OnClickListener listener) {  
            this.confirmButtonText = (String)context.getText(confirmButtonText);  
            this.confirmButtonClickListener = listener;  
            return this;  
        }  
    
        /** 
         * 设置确定按钮事件和文本 
         * @param negativeButtonText 
         * @param listener 
         * @return 
         */  
        public Builder setConfirmButton(String confirmButtonText, DialogInterface.OnClickListener listener) {  
             this.confirmButtonText = confirmButtonText;  
             this.confirmButtonClickListener = listener;  
             return this;  
        }  
    
        /** 
         * 创建自定义的对话框 
         */  
        public MyDialog create() {  
            LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
               
            // 实例化自定义的对话框主题  
            final MyDialog dialog = new MyDialog(context, R.style.Dialog);  
               
            View layout = inflater.inflate(R.layout.my_dialog, null);  
            dialog.addContentView(layout,   
                    new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));  
               
            // 设置对话框标题  
            ((TextView) layout.findViewById(R.id.dialog_title)).setText(title);  
               
            // 设置对话框内容  
            if (message != null) {  
                TextView dlgMsg = (TextView)layout.findViewById(R.id.dialog_message);  
                dlgMsg.setText(message);  
            } else if (contentView != null) {  
                // if no message set  
                // 如果没有设置对话框内容,添加contentView到对话框主体  
                ((LinearLayout) layout.findViewById(R.id.dialog_content)).removeAllViews();  
                ((LinearLayout) layout.findViewById(R.id.dialog_content)).addView(  
                    contentView, new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));  
            }  
               
            // 设置返回按钮事件和文本  
            if (backButtonText != null) {  
                Button bckButton = ((Button) layout.findViewById(R.id.dialog_back));  
                bckButton.setText(backButtonText);  
                   
                if (backButtonClickListener != null) {  
                    bckButton.setOnClickListener(new View.OnClickListener() {  
                        public void onClick(View v) {  
                            backButtonClickListener.onClick(dialog, DialogInterface.BUTTON_NEGATIVE);  
                        }  
                    });  
                }  
            } else {  
                layout.findViewById(R.id.dialog_back).setVisibility(View.GONE);  
            }  
               
            // 设置确定按钮事件和文本  
            if (confirmButtonText != null) {  
                Button cfmButton = ((Button) layout.findViewById(R.id.dialog_confirm));  
                cfmButton.setText(confirmButtonText);  
                   
                if (confirmButtonClickListener != null) {  
                    cfmButton.setOnClickListener(new View.OnClickListener() {  
                        public void onClick(View v) {  
                            confirmButtonClickListener.onClick(dialog, DialogInterface.BUTTON_POSITIVE);  
                        }  
                    });  
                }  
            } else {  
                layout.findViewById(R.id.dialog_confirm).setVisibility(View.GONE);  
            }  
               
            dialog.setContentView(layout);  
               
            return dialog;  
        }  
    
    }  
    
}

MainActivity.java:

package com.example.stuart.customdialog;

import android.app.Activity;


import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

import android.widget.Button;
import android.widget.Toast;


public class MainActivity extends Activity {

    private Mydialog mydialog;
    private Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn =(Button)findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {


               Mydialog.Builder builder =new Mydialog.Builder(MainActivity.this);
               builder.setTitle("提示");
               builder.setMessage("你要删除吗?!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
               builder.setConfirmButton("确定",new DialogInterface.OnClickListener() {
                   @Override
                   public void onClick(DialogInterface dialogInterface, int i) {

                   }
               });
               builder.setBackButton("返回",new DialogInterface.OnClickListener() {
                   @Override
                   public void onClick(DialogInterface dialogInterface, int i) {
                          mydialog.dismiss();
                   }
               }) ;
                mydialog=builder.create();
                mydialog.show();

            }

        });

    }




    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

ref:http://www.bug315.com/article/10.htm

ref:http://www.cnblogs.com/eustoma/p/3937099.html

posted @ 2015-06-13 23:46  Stuart001  阅读(229)  评论(0编辑  收藏  举报