对话框在我们开发app的过程中可以说都会有用到,最简单和最常用的就是AlertDialog对话框了,几行代码就可以把它搞掂,例如:
final AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setCancelable(false);// 设置点击dialog外侧不可取消 builder.setTitle("版本更新提醒"); builder.setMessage("是否更新版本");//设置文本内容 builder.setPositiveButton("立刻更新", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 下载最新的版本,显示下载的进度 downloadNewVersion(); } }); builder.setNegativeButton("稍后再说", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); AlertDialog alertDialog = builder.create(); alertDialog.show();// 在子线程中显示dialog,这个就是标准的弹出对话框,随时随地都可以使用。但是也会有它的缺陷,可能大家都发现了,它的样式布局是固定的,我们是不可以按需修改的,这个对于我们的用户体验来说就显得差了一点,所以下面请跟着我的思路来和大家封装一个对话框,它可以让你指定xml布局,修改标题,修改按钮文本,按钮颜色和处理事件任务。
public abstract class CommonDialog extends Dialog{ protected Context context; protected View view; protected float widthScale=0.84375f; public CommonDialog(Context context) { super(context, R.style.MyDialog); this.context=context; init(); } protected void init(){ view= LayoutInflater.from(context).inflate(initLayoutId(),null); ViewUtils.inject(this,view); setContentView(view); Window window=getWindow(); WindowManager.LayoutParams params=window.getAttributes(); //设置对话框在屏幕中间显示 params.gravity= Gravity.CENTER_VERTICAL; window.setAttributes(params); } public abstract int initLayoutId(); @Override public void show() { if(!isShowing()){ super.show(); } WindowManager.LayoutParams lp=getWindow().getAttributes(); lp.width= (int) (UIUtils.getScreenWidth()*widthScale);//设置对话框 getWindow().setAttributes(lp); } public View getView(){ return view; } //使某个控件消失 public void goneView(int id){ if(view!=null){ View goneView=view.findViewById(id); if(goneView!=null){ goneView.setVisibility(View.INVISIBLE); } } } //使某个控件不可见 public void visibilityView(int id){ if(view!=null){ View goneView=view.findViewById(id); if(goneView!=null){ goneView.setVisibility(View.VISIBLE); } } } public void switchToActivity(Context context,Class<?> clazz) { Intent intent=new Intent(context,clazz); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); dismiss(); } @Override public void dismiss() { if(view!=null){ view.clearAnimation(); } if(isShowing()){ super.dismiss(); } } }下面是对上面对话框的引用,其实这一个才是我想说的通用对话框,它的布局可以是通用的,在具体的场景的时候我们只需要修改它的标题,按钮文本和在回调中处理具体的事件方法。
public class DeleteDialog extends CommonDialog{ @ViewInject(R.id.btn_cancel) private Button btn_cancel; @ViewInject(R.id.btn_ok) private Button btn_ok; @ViewInject(R.id.tv_title) private TextView tv_title; public DeleteDialog(Context context) { super(context); setCancelable(false); } @Override public int initLayoutId() { return R.layout.dialog_delete; } public void setContent(String content){ tv_title.setText(content); } public void setBtn_cancel(String s){ btn_cancel.setText(s); } public void setBtn_ok(String s){ btn_ok.setText(s); } public void setOkOnClickListener(View.OnClickListener okOnClickListener){ btn_ok.setOnClickListener(okOnClickListener); } public void setCancelOnClickListener(View.OnClickListener cancelOnClickListener){ btn_cancel.setOnClickListener(cancelOnClickListener); } } 下面是这个对话框的布局xml: <?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="wrap_content" android:layout_margin="20dp" android:background="@drawable/dialog_shape" android:gravity="center_horizontal" android:orientation="vertical"> <TextView android:id="@+id/tv_title" android:layout_width="match_parent" android:layout_height="70dp" android:gravity="center" android:text="确定删除选中记录吗?" android:textColor="#333" android:textSize="@dimen/dialog_title_size" /> <View android:layout_width="match_parent" android:layout_height="0.5dp" android:background="#AFAFBC" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btn_cancel" android:layout_width="0dp" android:layout_height="@dimen/dialog_button_height" android:layout_weight="1" android:background="@drawable/dialog_button_single_selector" android:text="取消" android:textColor="#007AFF" android:textSize="@dimen/dialog_ok_size" /> <View android:layout_width="1dp" android:layout_height="@dimen/dialog_button_height" android:background="#E1E1E1" /> <Button android:id="@+id/btn_ok" android:layout_width="0dp" android:layout_height="@dimen/dialog_button_height" android:layout_weight="1" android:background="@drawable/dialog_button_single_selector" android:text="确定" android:textColor="#007AFF" android:textSize="@dimen/dialog_ok_size" /> </LinearLayout> </LinearLayout> @drawable/dialog_button_single_selector的xml: <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true"> <shape> <solid android:color="@color/dialog_option_pressed_bg"/> <corners android:bottomLeftRadius="@dimen/dialog_window_ratio" android:bottomRightRadius="@dimen/dialog_window_ratio"/> </shape> </item> <item> <color android:color="#0000"/> </item> </selector>