編輯:關於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
CoordinatorLayout 實現了多種Material Design中提到的滾動效果。目前這個框架提供了幾種不用寫動畫代碼就能工作的方法,這些效果包括: *讓浮動
在之前Google的系統還沒有更新的時候可以通過修改GoAgent的proxy.ini來登陸美國Play。現在介Google Play美國登錄的辦法,但是G
最近在看一本古董書《50 Android Hacks》,而書中開篇的第一個Hack就是”使用weight屬性實現視圖的居中現實“。事實上weigh
Android通訊錄模糊查詢搜索(號碼,姓名,首字母簡拼,全拼),批量選取聯系人 公司最近的項目中遇到一個需求需要讀取通訊錄聯系人,並需要支持對聯系人的模糊查詢及批量選