先来展示几种常见对话框吧!
以上为常见几种场景需要使用到的对话框!接下来来看看我们可以如何去实现他们吧.
//先贴出图片一的对话框实现步骤吧
1.写一个类继承Dialog
public class DefaultDialog extends Dialog implements View.OnClickListener{ private TextView tvContent; private TextView btnCancel; private TextView btnOk; private OnDefaultDialogListener onDefaultDialogListener; public interface OnDefaultDialogListener{ void onOk(); void onCancel(); } public DefaultDialog setOnDefaultDialogListener(OnDefaultDialogListener onDefaultDialogListener){ this.onDefaultDialogListener = onDefaultDialogListener; return this; } public DefaultDialog(Context context){ super(context, R.style.CustomDialog); setCancelable(true); setCanceledOnTouchOutside(false); } public DefaultDialog(Context context, boolean isOutCancel){ super(context, R.style.CustomDialog); setCancelable(isOutCancel); setCanceledOnTouchOutside(isOutCancel); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.dialog_default); initView(); } private void initView() { tvContent = (TextView) findViewById(R.id.tv_content); btnOk = (TextView) findViewById(R.id.confirm_button); btnCancel = (TextView) findViewById(R.id.cancel_button); btnOk.setOnClickListener(this); btnCancel.setOnClickListener(this); } public DefaultDialog setContentText(String content){ if (tvContent != null && content != null) { tvContent.setText(content); } return this; } /** * 显示Dialog * @return */ public DefaultDialog showdialog(){ this.show(); return this; } /** * 设置取消按钮 * @param content 设置取消内容 * @return */ public DefaultDialog setCancelText(String content){ if (btnCancel != null && content != null) { btnCancel.setText(content); } return this; } @Override public void onClick(View v) { switch (v.getId()){ case R.id.cancel_button: if(onDefaultDialogListener != null){ onDefaultDialogListener.onCancel(); } dismiss(); break; case R.id.confirm_button: if(onDefaultDialogListener != null){ onDefaultDialogListener.onOk(); } dismiss(); break; } } }
2.自定义的Dialog中需要配置style 下面贴出 R.style.CustomDialog 的配置 可以根据需求自行修改
<!--将会进入全屏--> <style name="CustomDialog" parent="android:style/Theme.Holo.DialogWhenLarge"> <!--背景颜色及透明程度--> <item name="android:windowBackground">@android:color/transparent</item> <!--是否有标题 --> <item name="android:windowNoTitle">true</item> <!--是否浮现在activity之上--> <item name="android:windowIsFloating">true</item> <!--是否模糊--> <item name="android:backgroundDimEnabled">true</item> <!--是否全屏--> <item name="android:windowFullscreen">true</item> <!--dialog进入动画--> <item name="android:windowEnterAnimation">@anim/dialog_push_down_in</item> <!--dialog退出动画--> <item name="android:windowExitAnimation">@anim/dialog_push_down_out</item> </style>
//这里的Style配置需要自行创建两个动画
//anim/dialog_push_down_in 动画的配置
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromYDelta="-100%p" android:toYDelta="0" android:duration="200" /> <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="200" /> </set>
//anim/dialog_push_down_out动画的配置
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromYDelta="0" android:toYDelta="-100%p" android:duration="200"/> <alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="200" /> </set>
3.写布局文件 (这边可以根据需求自定义dialog布局)这里贴出示例图片1 (R.layout.dialog_default )的dialog的布局 , 关于颜色还有文字就自己写吧
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/container" android:layout_width="270dp" android:layout_height="130dp" android:layout_gravity="center" android:background="@drawable/ect_white" android:gravity="center" android:orientation="vertical"> <TextView android:id="@+id/tv_content" android:layout_width="match_parent" android:layout_height="85dp" android:paddingRight="15dp" android:paddingLeft="15dp" android:gravity="center" android:text="1234568 \n haha " android:textColor="@color/text_color3" android:textSize="16dp" /> <View android:layout_width="match_parent" android:layout_height="@dimen/margin1" android:background="@color/bg1"> </View> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:id="@+id/cancel_button" android:layout_width="0dp" android:layout_height="44dp" android:layout_weight="1" android:gravity="center" android:text="@string/cancel" android:textSize="16sp" android:textColor="@color/line_color2"/> <View android:layout_width="1dp" android:layout_height="match_parent" android:background="@color/bg1"> </View> <TextView android:id="@+id/confirm_button" android:layout_width="0dp" android:layout_height="44dp" android:layout_weight="1" android:gravity="center" android:text="@string/ok" android:textSize="16sp" android:textColor="@color/line_color7"/> </LinearLayout> </LinearLayout>
4.配置完以上内容后,接下来示例如何使用自定义dialog
DefaultDialog dialog = new DefaultDialog(this, true); dialog.show(); dialog.setContentText(getString(R.string.to_find_password));//设置提示的文字 dialog.setCancelText(getString(R.string.cancel))//这个可以不设置 .setOnDefaultDialogListener(new DefaultDialog.OnDefaultDialogListener() { @Override public void onOk() { //点击确定执行 } @Override public void onCancel() { //点击取消执行 } });
//接下来贴上图二的自定义dialog
public class CameraDialog extends Dialog { private Context mContext; private OnDialogListener mListener; private LinearLayout rlytDialog; private TextView btnCamera; private TextView btnAlbum; private TextView btnCancel; private String mContentText; public CameraDialog(Context mContext, String title, OnDialogListener mListener) { super(mContext, R.style.CustomDialog); // TODO Auto-generated constructor stub this.mContext= mContext; this.mListener =mListener; mContentText = title; } public CameraDialog(Context context, OnDialogListener listener){ super(context ,R.style.CustomDialog); this.mContext = context; this.mListener = listener; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.dialog_camera); /**************************************************************************************/ this.setCanceledOnTouchOutside(true);// 设置点击屏幕Dialog不消失 true消失 false不消失 Window dialogWindow = this.getWindow(); WindowManager.LayoutParams lp = dialogWindow.getAttributes(); lp.width = WindowManager.LayoutParams.MATCH_PARENT; lp.height= WindowManager.LayoutParams.WRAP_CONTENT; dialogWindow.setAttributes(lp); dialogWindow.setGravity(Gravity.BOTTOM); setOwnerActivity((Activity)mContext); initView(); initData(); initEvent(); } private void initView() { btnCamera= (TextView) findViewById(R.id.btn_camera); btnAlbum= (TextView) findViewById(R.id.btn_album); btnCancel = (TextView) findViewById(R.id.btn_cancel); rlytDialog = (LinearLayout)findViewById(R.id.rlyt_dialog); enterAnima(); } private void initData() { } private void initEvent() { btnCamera.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { exitAnima(); if(mListener!= null) { mListener.onDialogMessage(0); } } }); btnAlbum.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { exitAnima(); if(mListener!= null) { mListener.onDialogMessage(1); } } }); btnCancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { exitAnima(); if(mListener!= null) { mListener.onDialogMessage(2); } } }); } public void hide() { this.dismiss(); } private void enterAnima() { rlytDialog.startAnimation(AnimationUtils.loadAnimation(mContext, R.anim.dialog_down_in)); } private void exitAnima() { Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.dialog_down_out); rlytDialog.startAnimation(animation); animation.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { CameraDialog.this.dismiss(); } @Override public void onAnimationRepeat(Animation animation) { } }); } public interface OnDialogListener { void onDialogMessage(int flag); } }
//布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="20dp" android:id="@+id/rlyt_dialog" android:background="@android:color/transparent" > <TextView android:id="@+id/btn_camera" android:layout_width="match_parent" android:layout_height="57dp" android:text="拍照" android:gravity="center" android:textColor="@color/line_color7" android:textSize="20sp" android:background="@drawable/ripple_white_bg" /> <View android:layout_width="match_parent" android:layout_height="0.5dp" android:background="@color/task_record_vertical_line"> </View> <TextView android:id="@+id/btn_album" android:layout_width="match_parent" android:layout_height="57dp" android:text="从相册中获取" android:gravity="center" android:textColor="@color/line_color7" android:textSize="20sp" android:background="@drawable/ripple_white_bg" /> <TextView android:id="@+id/btn_cancel" android:layout_width="match_parent" android:layout_height="57dp" android:layout_marginTop="@dimen/margin5" android:layout_marginBottom="8dp" android:text="@string/cancel" android:gravity="center" android:textColor="@color/line_color7" android:textSize="20sp" android:textStyle="bold" android:background="@drawable/ripple_white_bg" /> </LinearLayout>
后面三个dialog的样式布局自己写吧,反正跟示例1的代码完全一样,只是简单的换了布局,这里为了缩短篇幅就不贴了.
最后在来说一下,当使用recycleView时,如何实现点击对应条目在对应的位置显示对话框的主要代码吧
int[] location = new int[2]; v.getLocationInWindow(location);//获取V的坐标存在数组中 Window window = dialog.getWindow();//获取dialog的对象窗口 WindowManager.LayoutParams wl = window.getAttributes(); wl.x = 0; wl.y = location[1]; dialog.onWindowAttributesChanged(wl); dialog.show();
这边的 V 就是条目点击的V;dialog就是所创建的的dialog