今天写项目,发现这个DatePickerDialog给他设置了OnDateSetListener,但是我没有点击设置,它却回调了,判断不出我是否点击了设置,查看了网上一些方法:
方法一:自定义view的方法:http://www.2cto.com/kf/201501/367678.html
方法二:setButton方法:http://www.it165.net/pro/html/201503/36757.html
浏览了一下这两个方法,觉得方法一太麻烦,方法二的mDialog.getDatePicker();只有3.1以上才可以使用,两个方法都不好,后来继续浏览其它网页,发现一个比较牛逼的代码,深受启发。
http://blog.csdn.net/OnlyOneCoder/article/details/25481505
((ViewGroup) ((ViewGroup) this.getDatePicker().getChildAt(0)).getChildAt(0)).getChildAt(2).setVisibility(View.GONE);
这方法是根据picker的view布局设置隐藏天的,那么我也可以试试找出picker的完成按钮对它设置回调,而不用自带那个!
首先,我需要一个工具找到picker的button的view或它的id,然后设置 setOnClickListener
不知道网上有没有,反正不需要多复杂,自己写一个:
public class ViewUtil {
public static JSONObject getViewLayoutJson (View view) {
if (view == null) {
return new JSONObject();
} else {
JSONObject json = new JSONObject();
json.put("classname", view.getClass().getName());
json.put("width", view.getMeasuredWidth());
json.put("height", view.getMeasuredHeight());
json.put("top", view.getTop());
json.put("visibility", view.getVisibility());
json.put("id", view.getId());
if (view instanceof ViewGroup) {
JSONArray jsonarr = new JSONArray();
ViewGroup vg = (ViewGroup)view;
for (int i = 0; i < vg.getChildCount(); i++) {
jsonarr.add(getViewLayoutJson(vg.getChildAt(i)));
}
json.put("subview", jsonarr);
} else if (view instanceof TextView) {
TextView tv = (TextView)view;
json.put("text", tv.getText());
}
return json;
}
}
}
获取dialog布局的json数据:
JSONObject json = ViewUtil.getViewLayoutJson(dataDialog.getWindow().getDecorView());
String layout = json.toJSONString();
其中,寻找设置按钮,在英文系统中就是 “Done”,找到结果如下:
{
"classname" : "android.widget.Button",
"height" : 0,
"id" : 16908313,
"text" : "Done",
"top" : 0,
"visibility" : 0,
"width" : 0
}
完成按钮对应的id是16908313,进入android.R.id类,找到这个id,
// Field descriptor #8 I
public static final int button1 = 16908313;
这个id对应的名字是button1
知道这个id后,我们开始设计自定义dialog:
pimport android.app.DatePickerDialog;
import android.content.Context;
import android.view.View;
import android.widget.DatePicker;
public class AppPickerDialog extends DatePickerDialog {
private int chooiceYear, chooiceMonth, chooiceDay;
private DatePicker picker;
private Context mContent;
private OnDateSetListener mCallBack;
public AppPickerDialog(final Context context,
final OnDateSetListener callBack, int year, int monthOfYear,
int dayOfMonth) {
super(context, callBack, year, monthOfYear, dayOfMonth);
mContent = context;
}
@Override
public void onDateChanged(DatePicker view, int year, int month, int day) {
super.onDateChanged(view, year, month, day);
picker = view;
chooiceYear = year;
chooiceMonth = month;
chooiceDay = day;
}
/**
* 完成事件
* @param callBack
*/
public void setOnPositiveListener(OnDateSetListener callBack) {
mCallBack = callBack;
}
@Override
public void show() {
super.show();
this.getWindow().getDecorView().findViewById(android.R.id.button1)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dismiss();
if (mCallBack!=null) {
mCallBack.onDateSet(picker, chooiceYear, chooiceMonth,chooiceDay);
}
}
});
}
}
new的时候,不要传onDateSetListener事件(这个系统分法的,不好用),要另外set一个自己写的方法
最后使用方法:
dataDialog = new AppPickerDialog(this, null,
year0, // 传入年份
month0, // 传入月份
day0// 传入天数
);
dataDialog.setOnPositiveListener(new OnDateSetListener() {
@Override
public void onDateSet(DatePicker dp, int year,int month, int dayOfMonth) {
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(year, month, dayOfMonth, 0, 0, 0);
if (calendar.getTimeInMillis() > System.currentTimeMillis()) {
ToastUtil.showMessage(getActivity(), "请输入正确的时间!");
return;
}
year0 = year;
month0 = month;
day0 = dayOfMonth;
mq.id(R.id.birthday).text(year + "-" + (month+1) + "-" + dayOfMonth);
}
});
dataDialog.show();
大功告成,解决的简单粗暴。
((