Android本身提供的Dialog可以实现很到我们现有的功能,但随着用户对app的要求更加严格,样式的需求更加华丽系统所提供的控件现在已经满足不了我们现在的要求了。由于对UI的效果要求的越来越高,像圆角,自定义的单机效果,自定义图片效果,动画效果等都不能使用系统提供的Dialog来满足。所以使用自定义的dialog大大加强了dialog使用的灵活性。
自定义思路:继承android.app.Dialog,重写它的构造方法,使用自定义的Theme,在构造方法中addContentView加入自定义的布局成为对话框,加入自定义的方法实现想要的效果。
public class Custom_AlertDialog extends Dialog{ /** * Custom_Dialog dialog = new Custom_Dialog(this); dialog.addContentView(R.Layout.x, new LayoutParams(LayoutParams.WRAP_CONTENT, R.style.Custom_Dialog)); dialog.show(); */ private Context mcontext; private View mContentView; public Custom_AlertDialog(Context context, boolean cancelable, OnCancelListener cancelListener) { super(context, cancelable, cancelListener); mcontext = context; mContentView = LayoutInflater.from(context).inflate(R.layout.widget_alert_dialog, null); addContentView(mContentView , new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); } public Custom_AlertDialog(Context context, int theme) { super(context, R.style.Custom_Dialog); mcontext = context; mContentView = LayoutInflater.from(context).inflate(R.layout.widget_alert_dialog, null); addContentView(mContentView , new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); } public Custom_AlertDialog(Context context) { super(context, R.style.Custom_Dialog); mcontext = context; mContentView = LayoutInflater.from(context).inflate(R.layout.widget_alert_dialog, null); addContentView(mContentView , new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); } public Custom_AlertDialog setPositiveButton(String okStr, View.OnClickListener positiveListener){ initOkBtn(positiveListener, okStr); return this; } public Custom_AlertDialog setPositiveButton(int StringId, View.OnClickListener positiveListener){ String okStr = mcontext.getResources().getString(StringId); initOkBtn(positiveListener, okStr); return this; } public Custom_AlertDialog setNegativeButton(String cancelStr, View.OnClickListener negativeListener){ initCancelBtn(negativeListener, cancelStr); return this; } public void goneLine(){ LinearLayout line=(LinearLayout) findViewById(R.id.line); line.setVisibility(View.GONE); } //0表示失败,1表示成功 public void setSucess(boolean i,int id){ TextView message = (TextView) mContentView.findViewById(R.id.message); message.setVisibility(View.GONE); TextView title=(TextView)mContentView.findViewById(R.id.title); title.setVisibility(View.GONE); if(!i){ LinearLayout line=(LinearLayout) findViewById(R.id.ll_bt_ok); line.setBackgroundResource(R.drawable.button_dialog_left_both); TextView title2=(TextView)mContentView.findViewById(R.id.title2); title2.setText(id); title2.setVisibility(View.VISIBLE); }else{ LinearLayout line=(LinearLayout) findViewById(R.id.ll_bt_cancel); line.setBackgroundResource(R.drawable.button_dialog_left_both); TextView title1=(TextView)mContentView.findViewById(R.id.title1); title1.setVisibility(View.VISIBLE); title1.setText(id); } } public void setNobitmap(int id){ TextView message = (TextView) mContentView.findViewById(R.id.message); message.setVisibility(View.GONE); TextView title=(TextView)mContentView.findViewById(R.id.title); LinearLayout line=(LinearLayout) findViewById(R.id.ll_bt_cancel); line.setBackgroundResource(R.drawable.button_dialog_left_both); title.setText(id); } public void setTwoNobitmap(int id){ TextView message = (TextView) mContentView.findViewById(R.id.message); message.setVisibility(View.GONE); TextView title=(TextView)mContentView.findViewById(R.id.title); title.setText(id); } public Custom_AlertDialog setNegativeButton(int StringId, View.OnClickListener negativeListener){ String cancelStr = mcontext.getResources().getString(StringId); initCancelBtn(negativeListener, cancelStr); return this; } public void setMessage(String msg){ TextView message = (TextView) mContentView.findViewById(R.id.message); message.setText(msg); } public void setMessage(int msgId){ setMessage(mcontext.getString(msgId)); } public void setTitle(String msg){ TextView title=(TextView)mContentView.findViewById(R.id.title); title.setText(msg); } public void setTitle(int msgId){ setTitle(mcontext.getString(msgId)); } private void initOkBtn(View.OnClickListener positiveListener, String okStr) { View llOK = mContentView.findViewById(R.id.ll_bt_ok); TextView btOK = (TextView) mContentView.findViewById(R.id.bt_ok); TextView btCancel = (TextView) mContentView.findViewById(R.id.bt_cancel); btOK.setText(okStr); llOK.setVisibility(View.VISIBLE); btOK.setVisibility(View.VISIBLE); llOK.setOnClickListener(positiveListener); if(View.VISIBLE==btOK.getVisibility() && View.VISIBLE==btCancel.getVisibility()){ // mContentView.findViewById(R.id.ll_lable).setVisibility(View.VISIBLE); }else{ // mContentView.findViewById(R.id.ll_lable).setVisibility(View.GONE); } } private void initCancelBtn(View.OnClickListener negativeListener, String cancelStr) { View llCancel = mContentView.findViewById(R.id.ll_bt_cancel); TextView btOK = (TextView) mContentView.findViewById(R.id.bt_ok); TextView btCancel = (TextView) mContentView.findViewById(R.id.bt_cancel); btCancel.setText(cancelStr); llCancel.setVisibility(View.VISIBLE); btCancel.setVisibility(View.VISIBLE); llCancel.setOnClickListener(negativeListener); if(View.VISIBLE==btOK.getVisibility() && View.VISIBLE==btCancel.getVisibility()){ }else{ } } }自定义的theme:
<!-- 自定义Dialog的Style --> <style name="Custom_Dialog" parent="@android: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的自定义布局:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@null" > <LinearLayout android:id="@+id/one" android:layout_width="fill_parent" android:layout_height="wrap_content" android:alpha="90" android:paddingBottom="10dp" android:background="@drawable/bg_alertdialog" android:orientation="vertical" > <TextView android:id="@+id/title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="20dip" android:gravity="center" android:paddingLeft="10dip" android:paddingRight="10dip" android:text="@string/alert_dialog_title" android:textColor="@color/light_black" android:textSize="17.5sp" android:textStyle="bold" /> <TextView android:id="@+id/title1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="20dip" android:drawableLeft="@drawable/sucess" android:drawablePadding="8dp" android:paddingLeft="10dip" android:paddingRight="10dip" android:text="@string/alert_dialog_title" android:textColor="@color/light_black" android:textSize="17.5sp" android:textStyle="bold" android:visibility="gone" /> <TextView android:id="@+id/title2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="20dip" android:drawableLeft="@drawable/fail" android:drawablePadding="8dp" android:paddingLeft="10dip" android:paddingRight="10dip" android:text="@string/alert_dialog_title" android:textColor="@color/light_black" android:textSize="17.5sp" android:textStyle="bold" android:visibility="gone" /> <ImageView android:layout_width="fill_parent" android:layout_height="1dip" android:background="@color/white" /> <ScrollView android:layout_width="fill_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/message" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="25dp" android:layout_marginRight="25dp" android:layout_marginTop="15dp" android:gravity="center" android:lineSpacingExtra="10dp" android:paddingLeft="10dip" android:paddingRight="10dip" android:textColor="@color/light_black" android:textSize="14sp" /> </ScrollView> </LinearLayout> <LinearLayout android:id="@+id/two" android:layout_width="fill_parent" android:layout_height="1dip" android:layout_below="@id/one" android:background="#b2b2b2" > </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/two" android:background="@null" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="44dp" android:background="@null" android:orientation="horizontal" > <LinearLayout android:id="@+id/ll_bt_cancel" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:alpha="90" android:background="@drawable/button_dialog" android:gravity="center" android:orientation="horizontal" android:visibility="gone" > <TextView android:id="@+id/bt_cancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/str_cancel" android:textColor="@color/orange" android:textSize="17.5sp" /> </LinearLayout> <LinearLayout android:id="@+id/line" android:layout_width="1dp" android:layout_height="fill_parent" android:background="#b2b2b2" > </LinearLayout> <LinearLayout android:id="@+id/ll_bt_ok" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:alpha="90" android:background="@drawable/button_dialog_right" android:gravity="center" android:orientation="horizontal" android:visibility="gone" > <TextView android:id="@+id/bt_ok" android:layout_width="wrap_content" android:layout_height="fill_parent" android:gravity="center" android:text="@string/str_sure" android:textColor="@color/orange" android:textSize="17.5sp" android:textStyle="bold" /> </LinearLayout> </LinearLayout> </LinearLayout> </RelativeLayout>其中一个圆角背景:
<?xml version="1.0" encoding="UTF-8"?> <!-- 顶部圆角 白色背景 无边框 长方体 --> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="#FFFFFF" /> <corners android:bottomLeftRadius="0.1dp" android:bottomRightRadius="0.1dp" android:topLeftRadius="10dp" android:topRightRadius="10dp" /> </shape>
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_focused="true" android:drawable="@drawable/bg_alertdialog_buttom_right_select"></item> <item android:state_checked="true" android:drawable="@drawable/bg_alertdialog_buttom_right_select"></item> <item android:state_selected="true" android:drawable="@drawable/bg_alertdialog_buttom_right_select"></item> <item android:state_pressed="true" android:drawable="@drawable/bg_alertdialog_buttom_right_select"></item> <item android:drawable="@drawable/bg_alertdialog_buttom_right"></item> </selector>
在java代码中使用
private Custom_AlertDialog alerdialog; alerdialog = new Custom_AlertDialog(this); alerdialog.setTitle(R.string.alert_cancel_title); alerdialog.setMessage(R.string.alert_cancel_message); alerdialog.setNegativeButton(R.string.str_cancel, new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub alerdialog.dismiss(); } }); alerdialog.setPositiveButton(R.string.str_sure, new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub alerdialog.dismiss(); } }); alerdialog.show();