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