android開發同時選擇日期和時間,datePicker和timePick結合使用爲DateAndTimeDialog.java

android開發同時選擇日期和時間,datePicker和timePick結合使用爲DateAndTimeDialog.java

參考大佬博客:安卓原生時間選擇器,DatePicker和TimePicker並用,彈窗dialog

在大佬代碼的基礎上做了點完善已經補充 分別爲

  1. 多個TextView選擇日期時間時TextView的回寫問題(構造方法增加view id)
  2. 改彈窗時間選擇器的初始時間爲24h制度(改寫InitDialog方法)
  3. 增加getDate和getDateTime方法,方便多次複用

詳細代碼如下

//彈窗類 DateAndTimeDialog.java
public class DateAndTimeDialog {
    private Context mContext;
    private AlertDialog.Builder mAlertDialog;
    private int mHour, mMinute;
    private TimePickerDialogInterface timePickerDialogInterface;
    private TimePicker mTimePicker;
    private DatePicker mDatePicker;
    private int mTag = 0;
    private int mYear, mDay, mMonth;
    private int viewCode;

    public DateAndTimeDialog(Context context,int viewCode) {
        super();
        mContext = context;
        timePickerDialogInterface = (TimePickerDialogInterface) context;
        this.viewCode=viewCode;
    }

    /**
     * 初始化DatePicker
     *
     * @return
     */
    private View initDatePicker() {
        View inflate = LayoutInflater.from(mContext).inflate(
                R.layout.datepicker_layout, null);
        mDatePicker = (DatePicker) inflate
                .findViewById(R.id.datePicker);
        resizePikcer(mDatePicker);
        return inflate;
    }

    /**
     * 初始化TimePicker
     *
     * @return
     */
    private View initTimePicker() {
        View inflate = LayoutInflater.from(mContext).inflate(
                R.layout.timepicker_layout, null);
        mTimePicker = (TimePicker) inflate
                .findViewById(R.id.timePicker);
        mTimePicker.setIs24HourView(true);
        resizePikcer(mTimePicker);
        return inflate;
    }

    private View initDateAndTimePicker() {
        View inflate = LayoutInflater.from(mContext).inflate(
                R.layout.dateandtimepicker_layout, null);
        mTimePicker = (TimePicker) inflate
                .findViewById(R.id.dateAndTimePicker_timePicker);
        mDatePicker = (DatePicker) inflate
                .findViewById(R.id.dateAndTimePicker_datePicker);
        mTimePicker.setIs24HourView(true);
        resizePikcer(mTimePicker);
        resizePikcer(mDatePicker);
        return inflate;
    }

    /**
     * 創建dialog
     *
     * @param view
     */
    private void initDialog(View view) {
        Calendar calendar=Calendar.getInstance();
        mTimePicker.setCurrentHour(calendar.get(calendar.HOUR_OF_DAY));
        mAlertDialog.setPositiveButton("確定",
                new android.content.DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // TODO Auto-generated method stub
                        dialog.dismiss();

                        if (mTag == 0) {
                            getTimePickerValue();
                        } else if (mTag == 1) {
                            getDatePickerValue();
                        } else if (mTag == 2) {
                            getDatePickerValue();
                            getTimePickerValue();
                        }
                        timePickerDialogInterface.positiveListener(viewCode);

                    }
                });
        mAlertDialog.setNegativeButton("取消",
                new android.content.DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // TODO Auto-generated method stub
                        timePickerDialogInterface.negativeListener();
                        dialog.dismiss();
                    }
                });
        mAlertDialog.setView(view);
    }

    /**
     * 顯示時間選擇器
     */
    public void showTimePickerDialog() {
        mTag=0;
        View view = initTimePicker();
        mAlertDialog = new AlertDialog.Builder(mContext);
        mAlertDialog.setTitle("選擇時間");
        initDialog(view);
        mAlertDialog.show();

    }

    /**
     * 顯示日期選擇器
     */
    public void showDatePickerDialog() {
        mTag=1;
        View view = initDatePicker();
        mAlertDialog = new AlertDialog.Builder(mContext);
        mAlertDialog.setTitle("選擇時間");
        initDialog(view);
        mAlertDialog.show();
    }

    /**
     * 顯示日期時間選擇器
     */
    public void showDateAndTimePickerDialog() {
        mTag=2;
        View view = initDateAndTimePicker();
        mAlertDialog = new AlertDialog.Builder(mContext);
        mAlertDialog.setTitle("選擇時間");
        initDialog(view);
        mAlertDialog.show();
    }

    /*
     * 調整numberpicker大小
     */
    private void resizeNumberPicker(NumberPicker np) {
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(120,
                LinearLayout.LayoutParams.WRAP_CONTENT);
        params.setMargins(10, 0, 10, 0);
        np.setLayoutParams(params);
    }

    /**
     * 調整FrameLayout大小
     *
     * @param tp
     */
    private void resizePikcer(FrameLayout tp) {
        List<NumberPicker> npList = findNumberPicker(tp);
        for (NumberPicker np : npList) {
            resizeNumberPicker(np);
        }
    }

    /**
     * 得到viewGroup裏面的numberpicker組件
     *
     * @param viewGroup
     * @return
     */
    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 String getDate(){
        StringBuffer sb=new StringBuffer("");
        sb.append(mYear+"-");
        if(mMonth<10){
            sb.append(0);
        }
        sb.append(mMonth+"-");
        if(mDay<10){
            sb.append(0);
        }
        sb.append(mDay+" ");
        if(mHour<10){
            sb.append(0);
        }
        return  sb.toString();
    }

    public String getDateTime(){
        StringBuffer sb=new StringBuffer("");
        sb.append(mYear+"-");
        if(mMonth<10){
            sb.append(0);
        }
        sb.append(mMonth+"-");
        if(mDay<10){
            sb.append(0);
        }
        sb.append(mDay+" ");
        if(mHour<10){
            sb.append(0);
        }
        sb.append(mHour);
        if(mMinute<10){
            sb.append(0);
        }
        sb.append(":"+mMinute);
        return sb.toString();
    }

    public int getYear() {
        return mYear;
    }

    public int getDay() {
        return mDay;
    }

    public int getMonth() {
        //返回的時間是0-11
        return mMonth+1;
    }

    public int getMinute() {
        return mMinute;
    }

    public int getHour() {
        return mHour;
    }

    /**
     * 獲取日期選擇的值
     */
    private void getDatePickerValue() {
        mYear = mDatePicker.getYear();
        mMonth = mDatePicker.getMonth();
        mDay= mDatePicker.getDayOfMonth();
    }

    /**
     * 獲取時間選擇的值
     */
    private void getTimePickerValue() {
        // api23這兩個方法過時
        mHour = mTimePicker.getCurrentHour();// timePicker.getHour();
        mMinute = mTimePicker.getCurrentMinute();// timePicker.getMinute();
    }

    public interface TimePickerDialogInterface {
        public void positiveListener(int viewCode);
        public void negativeListener();
    }

}

// 三個佈局文件

//dateandtimepicker_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:gravity="center"
    android:layout_height="match_parent">
    <DatePicker
        android:id="@+id/dateAndTimePicker_datePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:datePickerMode="spinner"
        android:calendarViewShown="false"
        />
    <TimePicker
        android:id="@+id/dateAndTimePicker_timePicker"
        android:timePickerMode="spinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

// datepicker_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:gravity="center"
    android:layout_height="match_parent">
    <DatePicker
        android:id="@+id/datePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:calendarViewShown="false"
        android:datePickerMode="spinner"
        />
</LinearLayout>

// timepicker_layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:gravity="center"
    android:layout_height="match_parent">
    <TimePicker
        android:id="@+id/timePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:timePickerMode="spinner"
        />
</LinearLayout>

// activity_test.xml 的部分

 <TextView
    android:id="@+id/Create_Time1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="(選擇時間)"
    android:textColor="#999"
    android:textSize="15sp" />
  <TextView
   android:id="@+id/Create_Time2"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:text="(選擇時間)"
   android:textColor="#999"
   android:textSize="15sp" />

// TestActivity.java

public class TestActivity extends AppCompatActivity implements DateAndTimeDialog.TimePickerDialogInterface {

    private TextView Create_Time1,Create_Time2;
    private DateAndTimeDialog dateAndTimeDialog;

    private Calendar cal;
    private int year,month,day;


    private void init(){
        Create_Time1=findViewById(R.id.Create_Time1);
        Create_Time2=findViewById(R.id.Create_Time2);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        init();
        Create_Time1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dateAndTimeDialog=new DateAndTimeDialog(TestActivity.this,R.id.Create_Time1);
                dateAndTimeDialog.showDateAndTimePickerDialog();
            }
        });

        Create_Time2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dateAndTimeDialog=new DateAndTimeDialog(TestActivity.this,R.id.Create_Time2);
                dateAndTimeDialog.showDateAndTimePickerDialog();
            }
        });
     }

       
    @Override
    public void positiveListener(int viewCode) {
        TextView textView=findViewById(viewCode);
        textView.setText(dateAndTimeDialog.getDateTime());
    }

    @Override
    public void negativeListener() {

    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章