您的位置:首页 > 其它

自定义BaseDialog,继承BaseDialog实现自己想要的功能。

2017-01-09 14:13 495 查看
1.首先介绍我们的baseDialog,自定义常用的监听方法positive、negative。以及构造函数,自定义了两个构造函数,根据自己的需要是否添加监听事件实现dialog方法,getDialogStyleId方法是加载自定义dialog样式,在style文件中加载写入。

见如下代码:

import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.Display;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.LinearLayout;

/**
* Created by JackZheng on 16/11/9.
*/
public abstract class BaseDialog {

public OnBaseDialogListener baseDialogListener;

//定义回调事件,用于dialog的点击事件
public interface OnBaseDialogListener {
void positive();

void negative();
}

//这些属性,Context 是肯定要的,基本对话框要用它
protected Context context;
private Display display;//这个设置显示属性用的
private Dialog dialog;//自定义Dialog,Dialog还是要有一个的吧  //对话框布局的样式ID (通过这个抽象方法,我们可以给不同的对话框设置不同样式主题)

protected abstract int getDialogStyleId(); //构建对话框的方法(都说了是不同的对话框,布局什么的肯定是不一样的)

protected abstract View getView();  //构造方法 来实现 最基本的对话框

public BaseDialog(Context context) {
this.context = context;
initView();
}

public BaseDialog(Context context, OnBaseDialogListener baseDialogListener) {
this.baseDialogListener = baseDialogListener;
this.context = context;
initView();
}

/**
* 初始化 视图
*/
private void initView() {
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
display = windowManager.getDefaultDisplay(); //在这里初始化 基础对话框s
if (getDialogStyleId() == 0) {
dialog = new Dialog(context, Dialog.BUTTON_POSITIVE);
} else {
dialog = new Dialog(context, getDialogStyleId());
}
View view = getView();
// 调整dialog背景大小
view.setLayoutParams(new FrameLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
dialog.addContentView(view, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
//dialog.getWindow().setLayout(600, 400);//设置 宽高
dialog.setContentView(view);
}

/**
* Dialog 的基础方法, 凡是要用的就在这写出来,然后直接用对话框调本来的方法就好了,不够自己加~hhh
* 像这类设置对话框属性的方法,就返回值写自己,这样就可以一条链式设置了
*/
public BaseDialog setCancelable(boolean cancel) {
dialog.setCancelable(cancel);
return this;
}

public void show() {
dialog.show();
}

public void dismiss() {
if (isShowing())
dialog.dismiss();
}

public boolean isShowing() {
return dialog.isShowing();
}
}

2.写我们自定义的dialog,首先我们需要继承BaseDialog,然后有自己的布局文件,还有自己的dialog样式,在这里我写了三个构造函数,根据自己的需要是否自定义标题输入文本之类的自己选择。同样继承父类的想对应方法;getDialogStyleId():获取自定义dialog样式;getView()获取自定义layout布局文件;还有就是简单的加载自定义文字方法。

如下代码:

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;

import com.sudiyi.apps.xiaoht.R;
import com.sudiyi.apps.xiaoht.base.BaseDialog;

/**
* Created by JackZheng on 16/11/9.
* 加载 dialog
*/
public class SureOrCancelDialog extends BaseDialog {
private TextView mTvCancel;//取消
private TextView mTvSure;//确定
private TextView mTvTitle;//标题

public SureOrCancelDialog(Context context) {
super(context);
}

public SureOrCancelDialog(Context context, OnBaseDialogListener onBaseDialogListener) {
super(context, onBaseDialogListener);
}

/**
* @param context              上下文
* @param onBaseDialogListener 回调监听
* @param cancelName           自定义取消名字
* @param sureName             自定义确定名字
* @param title                自定义title
*/
public SureOrCancelDialog(Context context, OnBaseDialogListener onBaseDialogListener,
String title, String cancelName, String sureName) {
super(context, onBaseDialogListener);
setCancelName(cancelName);
setSureName(sureName);
setTitleName(title);
}
//设置对话框的样式

@Override
protected int getDialogStyleId() {
return R.style.Dialog;
}
//继承于BaseDialog的方法,设置布局用的,这样对话框张啥样久随心所欲啦

@Override
protected View getView() {  // 获取Dialog布局
View view = LayoutInflater.from(context).inflate(R.layout.sure_or_cancel_dialog, null);   //得到各种
mTvCancel = (TextView) view.findViewById(R.id.tv_cancel);
mTvSure = (TextView) view.findViewById(R.id.tv_sure);
mTvTitle = (TextView) view.findViewById(R.id.tv_title);
if (baseDialogListener != null) {
mTvCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
baseDialogListener.negative();
dismiss();
}
});
mTvSure.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
baseDialogListener.positive();
dismiss();
}
});
}
return view;
}

/**
* 设置取消名字
*
* @param string
* @return
*/
public BaseDialog setCancelName(String string) {
mTvCancel.setText(string);
return this;
}

/**
* 设置确定名字
*
* @param string
* @return
*/
public BaseDialog setSureName(String string) {
mTvSure.setText(string);
return this;
}

/**
* 设置标题名字
*
* @param string
* @return
*/
public BaseDialog setTitleName(String string) {
mTvTitle.setText(string);
return this;
}

}

3.最后贴上我自己使用的dialog的style

<!--自定义dialog 样式-->
<style name="Dialog" parent="android:style/Theme.Dialog">
<item name="android:background">#00000000</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowCloseOnTouchOutside">false</item><!--点击屏幕是否消失-->


4.附上我自己自定义的布局文件sure_or_cancel_dialog

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@drawable/bg_dialog"
android:orientation="vertical">

<LinearLayout
android:layout_width="260dp"
android:layout_height="140dp"
android:orientation="vertical">

<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="4"
android:gravity="center"
android:textColor="@color/black"
android:textSize="@dimen/text_size_middle"
android:textStyle="bold" />

<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="@color/divider" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="3"
android:orientation="horizontal">

<TextView
android:id="@+id/tv_cancel"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/sel_dialog_pressed"
android:gravity="center"
android:textColor="@color/color_cancel"
android:textSize="@dimen/text_size_upper_middle"
android:textStyle="bold" />

<View
android:layout_width="0.5dp"
android:layout_height="match_parent"
android:background="@color/divider" />

<TextView
android:id="@+id/tv_sure"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/sel_dialog_pressed"
android:gravity="center"
android:textColor="@color/color_sure"
android:textSize="@dimen/text_size_upper_middle"
android:textStyle="bold" />
</LinearLayout>
</LinearLayout>

</LinearLayout>

5.调用方法如下

SureOrCancelDialog deleteAddressTwoDialog = new SureOrCancelDialog(SearchActivity.this, new BaseDialog.OnBaseDialogListener() {
@Override
public void positive() {

}

@Override
public void negative() {
}
}, "确认将这个常用地址删除?", "取消", "确定");deleteAddressTwoDialog.setCancelable(true).show();

6.效果图如下:


ok,那么到这里呢,我们的文章就已经结束了,欢迎你的关注,如有什么疑问,可以直接回复我,我会在最快的时间回复你。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐