Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 自定義dialog+工具類

自定義dialog+工具類

編輯:關於Android編程

安卓低版本的效果很難看,高版本的dialog雖然好看,但還是和公司UI給的效果圖有些差距.

於是乎就想辦法能不能dialog的布局也能自定義.好了先看效果圖:

\

是不是感覺效果也很好,好了下邊看看步驟:

1.首先我們看一下這個自定義的Dialog類

 

    /**
     * 自定義帶兩個button的dialog
     * 
     * @author Haipeng
     * 
     *         2016-7-28
     */
    public class DefindedDialog extends Dialog {

	public DefindedDialog(Context context, int theme) {
		super(context, theme);
	}

	public DefindedDialog(Context context) {
		super(context);
	}

	public static class Builder {

		private Context context;
		private String title;
		private String message;
		private String positiveButtonText;
		private String negativeButtonText;
		private OnDedindedClickedListener onDedindedClickedListener;

		/**
		 * 
		 * @param context
		 * @param title
		 *            標題
		 * @param message
		 *            提示內容
		 * @param positiveButtonText
		 *            確定按鈕的文本
		 * @param negativeButtonText
		 *            取消按鈕
		 * @param onDedindedClickedListener
		 *            兩個按鈕的監聽
		 */
		public Builder(Context context, String title, String message,
				String positiveButtonText, String negativeButtonText,
				OnDedindedClickedListener onDedindedClickedListener) {
			super();
			this.context = context;
			this.title = title;
			this.message = message;
			this.positiveButtonText = positiveButtonText;
			this.negativeButtonText = negativeButtonText;
			this.onDedindedClickedListener = onDedindedClickedListener;
		}

		/**
		 * Create the custom dialog
		 */
		public DefindedDialog create() {
			final DefindedDialog dialog = new DefindedDialog(context,
					R.style.TwoButtonDialog);// 設置dialog的風格
			// 設置dialog不可取消 點擊其他地方不能隱藏
			dialog.setCanceledOnTouchOutside(false);
			dialog.setCancelable(false);

			View layout = View.inflate(context, R.layout.two_button_dialog,
					null);

			// 設置內容
			TextView tv_content = (TextView) layout
					.findViewById(R.id.two_btn_desc);
			if (TextUtils.isEmpty(message)) {
				tv_content.setVisibility(View.GONE);
			} else {
				tv_content.setVisibility(View.VISIBLE);
				tv_content.setText(message);
				tv_content.setMovementMethod(new ScrollingMovementMethod());
			}
			
			// 設置標題
			TextView tv_title = (TextView) layout
					.findViewById(R.id.two_btn_title);
//			View view = layout.findViewById(R.id.view);
			if (TextUtils.isEmpty(title)) {
				tv_title.setVisibility(View.GONE);
//				view.setVisibility(View.GONE);
			} else {
				// 間隔線
//				view.setVisibility(View.VISIBLE);
				tv_title.setVisibility(View.VISIBLE);
				tv_title.setText(title);
			}

			// 將自定義的布局設置上去
			dialog.setContentView(layout);

			// 設置確定按鈕的文字以及點擊事件
			Button confirm_btn = ((Button) layout
					.findViewById(R.id.confirm_btn));
			if (TextUtils.isEmpty(positiveButtonText)) {
				confirm_btn.setText("確定");
			} else {
				confirm_btn.setText(positiveButtonText);
			}
			confirm_btn.setOnClickListener(new View.OnClickListener() {
				public void onClick(View v) {
					onDedindedClickedListener.onPositiveButtonClieked(dialog);
					dialog.dismiss();
				}
			});

			// 設置取消按鈕
			Button cancle_btn = ((Button) layout.findViewById(R.id.cancle_btn));
			if (TextUtils.isEmpty(negativeButtonText)) {
				cancle_btn.setText("取消");
			} else {
				cancle_btn.setText(negativeButtonText);
			}
			cancle_btn.setOnClickListener(new View.OnClickListener() {
				public void onClick(View v) {
					onDedindedClickedListener.onNegativeButtonClieked(dialog);
					dialog.dismiss();
				}
			});

			// 設置dialog的寬度
			WindowManager.LayoutParams params = dialog.getWindow()
					.getAttributes();
			params.width = getScreenWidth(context) - dp2px(context, 50);
			dialog.getWindow().setAttributes(params);

			return dialog;
		}

		/**
		 * 獲得屏幕寬度
		 * 
		 * @param context
		 * @return
		 */
		public int getScreenWidth(Context context) {
			WindowManager wm = (WindowManager) context
					.getSystemService(Context.WINDOW_SERVICE);
			DisplayMetrics outMetrics = new DisplayMetrics();
			wm.getDefaultDisplay().getMetrics(outMetrics);
			return outMetrics.widthPixels;
		}

		/**
		 * dp轉px
		 * 
		 * @param context
		 * @param val
		 * @return
		 */
		public int dp2px(Context context, float dpVal) {
			return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
					dpVal, context.getResources().getDisplayMetrics());
		}

	}

	/**
	 * 當點擊確定的時候會調用onPositiveButtonClieked 當點擊取消的時候會調用onPositiveButtonClieked
	 * 
	 * @author Haipeng
	 * 
	 *         2016-7-28
	 */
	public interface OnDedindedClickedListener {
		
		void onPositiveButtonClieked(DefindedDialog dialog);

		void onNegativeButtonClieked(DefindedDialog dialog);
	}
}

注意:

首先,這個類繼承Dialog 關於dialog的設置都在內部類Builder中設置

在Dialog的builder中的create()方法中創建dialog的實例

接著 在Buider的構造方法中,部所有的構造方法中所需要的參數都傳遞過來

包括確定和取消按鈕的監聽

然後 OnDedindedClickedListener接口中的兩個方法分別在兩個按鈕點擊的時候調用

最後 在Oncreate中設置了Dialog 的布局 這也就是說 dialog的大小可以由我們去設置

靈活性也更大 比如說我們需要三個按鈕的Dialog 我們只需要在布局文件中

添加一個按鈕,代碼稍作修改就好

2.下邊貼出Dialog的布局文件

 




    

    

    
    


    

    

    

    
3.Builder的create()中需要一個風格

 

 

注意:

 

首先 這個風格是去掉dialog默認的背景 設置沒有標題

接著 windowIsFloating屬性設置為false, 默認將Window設置成全屏大小,設置為true,則window大小為wrap_content。

這個屬性的作用參考這篇文章

4.下邊看這個自定義Dialog的封裝

 

/**
 * 創建Dialog的工具類
 * 
 * @author Haipeng
 * 
 *         2016-7-28
 */
public class DialogUtils {

	/**
	 * 只要內容的dialog 兩個按鈕的文字設置為默認  不要標題
	 * 
	 * @param context
	 * @param content
	 * @param listener
	 * @return
	 */
	public static Dialog commonDialogTwoBtn(Context context, String content,
			DefindedDialog.OnDedindedClickedListener listener) {
		return commonDialogTwoBtn(context, null, content, "確定", "取消", listener);
	}

	/**
	 * 只要內容的dialog 兩個按鈕的文字設置為不默認
	 * 
	 * @param context
	 * @param content
	 * @param positiveName
	 * @param negativeName
	 * @param listener
	 * @return
	 */
	public static Dialog commonDialogTwoBtn(Context context, String content,
			String positiveName, String negativeName,
			DefindedDialog.OnDedindedClickedListener listener) {
		return commonDialogTwoBtn(context, null, content, positiveName,
				negativeName, listener);
	}

	/**
	 * 既要內容 又要標題的dialog 並且兩個按鈕的文字設置為默認
	 * 
	 * @param context
	 * @param title
	 * @param content
	 * @param listener
	 * @return
	 */
	public static Dialog commonDialogTwoBtn(Context context, String title,
			String content, DefindedDialog.OnDedindedClickedListener listener) {
		return commonDialogTwoBtn(context, title, content, "確定", "取消", listener);
	}

	/**
	 * 既要內容 又要標題的dialog 並且兩個按鈕的文字不默認
	 * 
	 * @param context
	 * @param title
	 * @param content
	 * @param positiveName
	 * @param negativeName
	 * @param listener
	 * @return
	 */
	public static Dialog commonDialogTwoBtn(Context context, String title,
			String content, String positiveName, String negativeName,
			DefindedDialog.OnDedindedClickedListener listener) {
		if (TextUtils.isEmpty(content)) {
			return null;
		}
		if (listener == null) {
			return null;
		}
		DefindedDialog.Builder alert = new DefindedDialog.Builder(context,
				title, content, positiveName, negativeName, listener);

		DefindedDialog dialog = alert.create();
		dialog.show();
		return dialog;
	}

}
注意 這裡邊的兩個按鈕的文案一般默認為確認和取消 當然你也可以傳別的 標題可有可無

 

5.在MainActivity中調用下看看效果

 

        private Button warming;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		warming = (Button) findViewById(R.id.warming);
		warming.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.warming:
			OnDedindedClickedListener onDedindedClickedListener = new DefindedDialog.OnDedindedClickedListener() {

				@Override
				public void onPositiveButtonClieked(DefindedDialog dialog) {
					Toast.makeText(MainActivity.this, "確定", Toast.LENGTH_SHORT)
							.show();
				}

				@Override
				public void onNegativeButtonClieked(DefindedDialog dialog) {
					Toast.makeText(MainActivity.this, "取消", Toast.LENGTH_SHORT)
							.show();
				}
			};
			DialogUtils.commonDialogTwoBtn(this, "你確定要刪除該商品嗎?",
					onDedindedClickedListener);
			DialogUtils.commonDialogTwoBtn(this, "刪除", "你確定要刪除該商品嗎?",
					onDedindedClickedListener);
			DialogUtils.commonDialogTwoBtn(this, "你確定要刪除該商品嗎?", "確定", "取消",
					onDedindedClickedListener);
			DialogUtils.commonDialogTwoBtn(this, "刪除", "你確定要刪除該商品嗎?", "確定",
					"取消", onDedindedClickedListener);
			break;
		}
	}
布局文件中就一個按鈕 為了方便大家看效果 這裡第一下按鈕直接彈出了四個Dialog

 

 


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved