今天写项目,发现这个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();
大功告成,解决的简单粗暴。
((