之前的一篇博客里面提到了自定义 Dialog ,然而在项目中一般不会用到那种写法。
下面整理一个平时常用的 自定义 Dialog ,方便后面项目开发中使用。
效果图:
code :
public void showFeedBackDialog() {
View view = LayoutInflater.from(this).inflate(R.layout.dialog_setting, null);
TextView title = V.find(view, R.id.tv_title);
TextView content = V.find(view, R.id.tv_content);
final EditText et_content = V.find(view, R.id.et_content);
TextView cancel = V.find(view, R.id.tv_cancel);
TextView confirm = V.find(view, R.id.tv_confirm);
title.setText(getString(R.string.feedback));
content.setVisibility(View.GONE);
et_content.setVisibility(View.VISIBLE);
et_content.setHint(getString(R.string.feedback_hint));
confirm.setText(getString(R.string.commit));
final Dialog dialog = new Dialog(this, R.style.style_loading_dialog);
dialog.setContentView(view);
// 点击外部是否可取消 Dialog
dialog.setCanceledOnTouchOutside(false);
// 点击返回按钮是否能取消 Dialog
dialog.setCancelable(false);
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
confirm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (et_content.getText().toString().length() <= 0) {
toast("请输入反馈内容");
return;
}
client.FEEDBACK(mToken, et_content.getText().toString());
// TODO 点击提交按钮
dialog.dismiss();
}
});
Display dm = getWindowManager().getDefaultDisplay();
WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
lp.width = (int) (dm.getWidth() * 0.7);
dialog.getWindow().setAttributes(lp);
dialog.show();
}
上面是根据所占屏幕的比例来设置 Diaolog 的宽度,如果需要根据设计图所给定的大小来设置,可以使用下面这种方式:
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
lp.width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 210, dm);
lp.height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 148, dm);
dialog.getWindow().setAttributes(lp);
创建 Dialog 的样式我这边也直接贴出来:
<!--Dialog 样式-->
<style name="style_loading_dialog" parent="android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
界面布局这里就不贴了,只是作为一个常用功能整理。
再次简化一下 Dialog 的创建:
/**
* 创建 Dialog
*
* @param context
* @param view 布局视图
* @param scale 宽度比例
* @return
*/
public static Dialog createDialog(Context context, View view, float scale) {
final Dialog dialog = new Dialog(context, R.style.style_loading_light_dialog);
dialog.setContentView(view);
dialog.setCancelable(true);
dialog.setCanceledOnTouchOutside(true);
Display dm = ((Activity) context).getWindowManager().getDefaultDisplay();
WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
lp.width = (int) (dm.getWidth() * scale);
dialog.getWindow().setAttributes(lp);
dialog.show();
return dialog;
}
使用:
public static void uploadFailedAlert(Context context, final View.OnClickListener clickListener) {
View view = LayoutInflater.from(context).inflate(R.layout.dialog_upload_failed, null);
final Dialog dialog = createDialog(context, view, 0.7f);
V.find(view, R.id.tv_cancel).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
if (clickListener != null) {
clickListener.onClick(v);
}
}
});
}