Android 自定義AlertDialog對話框

系統默認的AlertDialog,與項目的UI不統一,因此,改了一下,定義了同樣式,最終效果以下圖:

另外,爲了儘可能少改原來的代碼,該類類名及相關方法名都與android.app.AlertDialog相同,使用時,原代碼只須要修改導入的包名,在按鈕的Listener上加上一句關閉對話框的方法便可.
先是對話框的XML佈局文件:
test.xmljava

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >     <!-- 頂部橢園邊緣 -->
    <ImageView        android:layout_width="400dp"        android:layout_height="22dp"        android:src="@drawable/dialog_top" >
    </ImageView>
	<!-- 中間白色背景,兩個TextView,標題和內容,留一個LinearLayout,在代碼中根據調用動態加上按鈕 -->
    <LinearLayout        android:layout_width="400dp"        android:layout_height="wrap_content"        android:background="@drawable/dialog_center"        android:orientation="vertical" >         <TextView android:textColor="#000000"            android:textSize="35dp"            android:gravity="center"            android:id="@+id/title"            android:layout_width="fill_parent"            android:layout_height="wrap_content" />         <TextView android:layout_marginLeft="20dp"            android:layout_marginRight="10dp"            android:id="@+id/message"            android:layout_marginBottom="10dp"            android:layout_marginTop="20dp"            android:textColor="#000000"            android:textSize="25dp"            android:layout_width="fill_parent"            android:layout_height="wrap_content" />
		<!-- 在LinearLayout中加按鈕 -->
        <LinearLayout            android:id="@+id/buttonLayout"            android:layout_width="fill_parent"            android:layout_height="fill_parent"            android:layout_gravity="center"            android:gravity="center"            android:orientation="horizontal" >         </LinearLayout>
    </LinearLayout>
    <!-- 底部橢園邊緣 -->
    <ImageView        android:layout_marginTop="-2dp"        android:layout_width="400dp"        android:layout_height="22dp"        android:src="@drawable/dialog_bottom" >
    </ImageView> </LinearLayout>

按鈕背景,不一樣狀態不一樣,可參考本博相關文章:
alertdialog_button.xmlandroid

<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_pressed="true" android:drawable="@drawable/dialog_button_pressed" />
	<item android:state_focused="true" android:drawable="@drawable/dialog_button_pressed" />
	<item android:drawable="@drawable/dialog_button" /></selector>

下面就是自定義的AlertDialog類的代碼:web

public class AlertDialog {
	Context context;
	android.app.AlertDialog ad;
	TextView titleView;
	TextView messageView;
	LinearLayout buttonLayout;
	public AlertDialog(Context context) {
		// TODO Auto-generated constructor stub
		this.context=context;
		ad=new android.app.AlertDialog.Builder(context).create();
		ad.show();
		//關鍵在下面的兩行,使用window.setContentView,替換整個對話框窗口的佈局
		Window window = ad.getWindow();
		window.setContentView(R.layout.alertdialog);
		titleView=(TextView)window.findViewById(R.id.title);
		messageView=(TextView)window.findViewById(R.id.message);
		buttonLayout=(LinearLayout)window.findViewById(R.id.buttonLayout);
	}
	public void setTitle(int resId)
	{
		titleView.setText(resId);
	}
	public void setTitle(String title) {
		titleView.setText(title);
	}
	public void setMessage(int resId) {
		messageView.setText(resId);
	} 	public void setMessage(String message)
	{
		messageView.setText(message);
	}
	/**
	 * 設置按鈕
	 * @param text
	 * @param listener
	 */
	public void setPositiveButton(String text,final View.OnClickListener listener)
	{
		Button button=new Button(context);
		LinearLayout.LayoutParams params=new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
		button.setLayoutParams(params);
		button.setBackgroundResource(R.drawable.alertdialog_button);
		button.setText(text);
		button.setTextColor(Color.WHITE);
		button.setTextSize(20);
		button.setOnClickListener(listener);
		buttonLayout.addView(button);
	} 	/**
	 * 設置按鈕
	 * @param text
	 * @param listener
	 */
	public void setNegativeButton(String text,final View.OnClickListener listener)
	{
		Button button=new Button(context);
		LinearLayout.LayoutParams params=new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
		button.setLayoutParams(params);
		button.setBackgroundResource(R.drawable.alertdialog_button);
		button.setText(text);
		button.setTextColor(Color.WHITE);
		button.setTextSize(20);
		button.setOnClickListener(listener);
		if(buttonLayout.getChildCount()>0)
		{
			params.setMargins(20, 0, 0, 0);
			button.setLayoutParams(params);
			buttonLayout.addView(button, 1);
		}else{
			button.setLayoutParams(params);
			buttonLayout.addView(button);
		} 	}
	/**
	 * 關閉對話框
	 */
	public void dismiss() {
		ad.dismiss();
	} }

使用方法:app

final AlertDialog ad=new AlertDialog(Test.this);
ad.setTitle("標題");
ad.setMessage("內容sdfsafdasf內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容");
ad.setPositiveButton("肯定", new OnClickListener() { 
@Override					
public void onClick(View v) {
	// TODO Auto-generated method stub
	ad.dismiss();
	Toast.makeText(Test.this, "被點到肯定", Toast.LENGTH_LONG).show(); 		
}
}); 
ad.setNegativeButton("取消", new OnClickListener() { 
@Override					
public void onClick(View v) {
// TODO Auto-generated method stub
ad.dismiss();
Toast.makeText(Test.this, "被點到取消", Toast.LENGTH_LONG).show();
}
});
相關文章
相關標籤/搜索