关于为什么使用DialogFragment而不是使用Dialog的实现,可以参考一下博客的关于DialogFragment的优点:
http://blog.csdn.net/lmj623565791/article/details/42628537
实现的效果图:
代码实现:
public class ChooseTimeDialog extends DialogFragment {
private DatePicker date_picker;
private TimePicker time_picker;
private Button advance_order_btn;
private Button come_order_btn;
private View view;
private String hour = "";
private String minute = "";
private Handler handler;
public ChooseTimeDialog() {
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ContextThemeWrapper wrapper = new ContextThemeWrapper(getActivity(),android.R.style.Theme_Holo_Light_NoActionBar);
inflater = inflater.cloneInContext(wrapper);
view = inflater.inflate(R.layout.dialog_choose_time,container,false);
getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
date_picker = (DatePicker)view.findViewById(R.id.date_picker);
time_picker = (TimePicker)view.findViewById(R.id.time_picker);
advance_order_btn = (Button)view.findViewById(R.id.advance_order_btn);
come_order_btn = (Button)view.findViewById(R.id.come_order_btn);
Calendar cal = Calendar.getInstance();
date_picker.init(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), null);
time_picker.setIs24HourView(true);
resizePicker(date_picker);
resizePicker(time_picker);
advance_order_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setTime(date_picker,time_picker,1);
ChooseTimeDialog.this.dismiss();
}
});
come_order_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ChooseTimeDialog.this.dismiss();
}
});
return view;
}
private void setTime(DatePicker datePicker, TimePicker timePicker, int tag) {
String month = datePicker.getMonth() + 1 + "";
String day = datePicker.getDayOfMonth() + "";
hour = timePicker.getCurrentHour() + "";
minute = timePicker.getCurrentMinute() + "";
timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
public void onTimeChanged(TimePicker view, int hourOfDay, int minuteOfHour) {
hour = hourOfDay + "";
minute = minuteOfHour + "";
}
});
if (month.length() == 1) {
month = "0" + month;
}
if (day.length() == 1) {
day = "0" + day;
}
if (hour.length() == 1) {
hour = "0" + hour;
}
if (minute.length() == 1) {
minute = "0" + minute;
}
String timeStr = "";
timeStr = datePicker.getYear() + "-" + month + "-" + day + " " + hour+ ":" + minute+":"+"00";
//Toast.makeText(GlobalContext.getInstance(), timeStr, Toast.LENGTH_LONG).show();
Message message = Message.obtain();
message.obj = timeStr;
handler.sendMessage(message);
}
private void resizePicker(FrameLayout frame)
{
List<NumberPicker> list = findNumberPicker(frame);
for(NumberPicker picker : list)
{
resizeNumberPicker(picker);
}
}
private void resizeNumberPicker(NumberPicker picker)
{
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(10,0,10,0);
picker.setLayoutParams(params);
}
private List<NumberPicker> findNumberPicker(ViewGroup viewGroup){
List<NumberPicker> npList = new ArrayList<NumberPicker>();
View child = null;
if(null != viewGroup){
for(int i = 0; i < viewGroup.getChildCount(); i++){
child = viewGroup.getChildAt(i);
if(child instanceof NumberPicker){
npList.add((NumberPicker)child);
}
else if(child instanceof LinearLayout){
List<NumberPicker> result = findNumberPicker((ViewGroup)child);
if(result.size()>0){
return result;
}
}
}
}
return npList;
}
public void setHandler(Handler handler)
{
this.handler = handler;
}
}
实现这样效果的关键地方是需要设置一下主题:
ContextThemeWrapper wrapper = new ContextThemeWrapper(getActivity(),android.R.style.Theme_Holo_Light_NoActionBar);通过这段代码就可以实现主题的设置。如果时间选择器是一个Activity则可以通过在mainfest里面配置一下就可以:
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/item_lay" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/color_white" android:orientation="vertical" >
<TextView android:id="@+id/title_txt" android:layout_width="match_parent" android:layout_height="50dp" android:layout_gravity="top" android:background="@color/txt_red" android:gravity="center" android:paddingLeft="10dp" android:paddingRight="10dp" android:text="@string/choose_time" android:textColor="@color/color_white" android:textSize="@dimen/txt_size" />
<LinearLayout android:id="@+id/view_stub_lay" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_gravity="center" >
<DatePicker android:id = "@+id/date_picker" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:calendarViewShown="false" style="@android:style/Theme.Holo.Light.NoActionBar" />
<TimePicker android:layout_width="wrap_content" android:layout_height="wrap_content" android:id = "@+id/time_picker" style="@android:style/Theme.Holo.Light.NoActionBar" />
</LinearLayout>
<!--两个按钮-->
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="@color/txt_black" android:orientation="horizontal" android:gravity="right|center_horizontal" >
<Button android:id="@+id/come_order_btn" style="@style/button_style" android:background="@drawable/button_rect_dark_selector" android:text="@string/cancel" android:layout_gravity="center_vertical"/>
<Button android:id="@+id/advance_order_btn" style="@style/button_style" android:background="@drawable/red_selector" android:text="@string/sure" android:layout_gravity="center_vertical"/>
</LinearLayout>
</LinearLayout>
注意:1.本人是通过Handler实现数据的传递。
2.在小米手机上,如果多次单击某个控件弹出时间选择器,会出现异常信息,具体的解决方法是,每次需要弹出时间选择器是,都从新的new一遍对象。