###为什么要避免时间验证
首先,我们确定的是时间的格式通常是如何的?当我们使用Edittext输入时间的时候,是不是需要 - 来区别呢?系统通常都是用ms来表示时间,然后转换为显示的时间。所以,我们应该尽量的避免时间的验证,那么问题就有了。如何去避免呢?就是今天的内容。

涉及的知识点

DialogFragment DatePicker 观察者模式

1.DialogFragment的使用

2.DatePicker的使用和理解

3.如何使用回调

interface

下面那个String 是为了传递数据,int 可以判断传递的类型。
当知道多种类型后,那么复用这个问题就来了。

public interface Settime {
    public void onclick(String name,int item);
}

首先明确我们拥有的布局文件

下面的布局是点击后的弹窗布局

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

    <DatePicker
        android:id="@+id/datepicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:calendarViewShown="false" />

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="提交" />

</LinearLayout>

上面的布局是不是很简单呢?是的,因为Fragment是一个可以碎片,通常用于一个Activity用于展示多种页面。可以让app的页面更丰富和精彩。

public class Test5_1 extends DialogFragment {

    private String dateString;
    private Settime onitem;

    @Override
    public void onAttach(Activity activity) {
      
        try {
            onitem = (Settime) activity;
        } catch (Exception e) {
           
        }

        super.onAttach(activity);
    }

    @Override
    public View onCreateView(LayoutInflater inflater,
            @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.test5_1, null);
        DatePicker datePicker = (DatePicker) v.findViewById(R.id.datepicker);
        // datePicker.setc
        Calendar calendar = Calendar.getInstance();

        int year = calendar.get(Calendar.YEAR);
        int monthOfYear = calendar.get(Calendar.MONTH);
        int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);

        String monthOfYear__;
        String dayOfMonth__;
        if (monthOfYear <= 8) {
            monthOfYear__ = "0" + (monthOfYear + 1);
        } else {
            monthOfYear__ = "" + (monthOfYear + 1);
        }
        if (dayOfMonth <= 8) {
            dayOfMonth__ = "0" + dayOfMonth;
        } else {
            dayOfMonth__ = "" + dayOfMonth;
        }
        dateString = "" + year + "-" + monthOfYear__ + "-" + dayOfMonth__;
        // 上面的是初始化时间

        datePicker.setMaxDate(calendar.getTimeInMillis());

        datePicker.init(year, monthOfYear, dayOfMonth,
                new OnDateChangedListener() {

                    public void onDateChanged(DatePicker view, int year,
                            int monthOfYear, int dayOfMonth) {
                        // 对下面对时间格式处理
                        String monthOfYear_;
                        if (monthOfYear <= 8) {
                            monthOfYear_ = "0" + (monthOfYear + 1);
                        } else {
                            monthOfYear_ = "" + (monthOfYear + 1);
                        }

                        String dayOfMonth_;

                        if (dayOfMonth <= 8) {
                            dayOfMonth_ = "0" + (dayOfMonth);
                        } else {
                            dayOfMonth_ = "" + (dayOfMonth);
                        }
                        // 对上面时间格式处理
                        dateString = "" + year + "-" + monthOfYear_ + "-"
                                + dayOfMonth_;
                    }

                });
        Button button = (Button) v.findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                onitem.onclick(dateString, 0);
                dismiss();
            }
        });

        return v;
    }
}

知识点

上面利用 Calendar 实现了DatePicker 数据的初始化。
然后为什么这么复杂?
因为如果点击进去,时间没有 改变,那么会没有返回时间,当然也可以在一开始的Activity中设定好时间。这里就需要注意在button的点击事件中判断 datepicker是不是有改变过了。

public void onAttach(Activity activity) 这是不是很熟悉呢?为了绑定 activtiy中的回调函数而使用,从而达到在DialogFragment中调用Activity的回调函数,从DialogFragment的数据传递到Activity中。
预览:

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

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:drawable/edit_text"
        android:text="dddsdfdsfdsd" />

</LinearLayout>
public class Test5 extends FragmentActivity implements Settime{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
       
        super.onCreate(savedInstanceState);

        
        setContentView(R.layout.test5);
        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(onClickListener );
            

    }
    private OnClickListener onClickListener = new  OnClickListener() {
        
        @Override
        public void onClick(View v) {
            getSupportFragmentManager().beginTransaction().add(new Test5_1(), "").commit();
        }
    };

    @Override
    public void onclick(String name, int item) {
        Button button = (Button)findViewById(R.id.button);
        button.setText(name);
    }
}

知识点

其实这里没多大知识点,唯一注意的是getSupportFragmentManager() 和getFragmentManger() 的兼容性问题。

预览:

Tag

学会简单的思想方式避免问题的复杂化。减少复杂代码,那么以后的问题和繁琐的过程就会少很多。