安卓(Android)實現選擇時間功能_Android

來源:互聯網
上載者:User

前言

由於大部分android初級教程都沒教怎麼選擇時間,初學者碰到這種難免會有些不知所措,難道要讓使用者自己輸入日期時間?先不說使用者體驗不好,處理使用者輸入各式各樣的日期格式也要花好大一番功夫,下面看看如何?android選擇時間的功能。

android 6.0 中的運行效果


TimePickerDialog和DatePickerDialog介紹

系統封裝好了兩個類可以供我們直接調用,TimepickerDialog用於選擇時間,DatePickerDialog用於選擇日期。

TimePikckerDialog的構造方法

public TimePickerDialog(Context context, OnTimeSetListener listener, int hourOfDay, int minute, boolean is24HourView)

     1、第一個參數接受一個context資訊

     2、第二個參數為當選擇時間完成後執行的回調介面

     3、第三個參數和第四個參數為初始化的時間

     4、第四個參數選擇true代表24小時制,false代表12小時制

DatePickerDialog構造方法

public DatePickerDialog(Context context, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth)

      1、第一個參數接受context資訊

      2、第二個參數為日期選擇完成後的回掉介面

      3、最後三個參數分別為初始化的年月日

可以看出兩者的構造方法基本相差不多,由於兩者都是繼承自AlertDialog,所以得到兩者對象後只要調用它們的show()方法即可將選擇框彈出。

具體實現

有兩種實現方式,一種是直接在Activity中使用,還有一種是通過FragmentDialog使用。

直接在Activity中使用比較簡單,不過代碼會比較亂,通過FragmentDialog管理的使用方式會比較優雅,而且便於管理。

直接在Activity中使用

布局檔案,裡面就一個TextView用於顯示所選時間

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"  tools:context="com.example.testdemo.TestActivity">  <TextView    android:layout_centerInParent="true"    android:textSize="20sp"    android:id="@+id/time_text"    android:text="點此選擇時間"    android:layout_width="wrap_content"    android:layout_height="wrap_content" /></RelativeLayout>

Activity檔案:

public class TestActivity extends AppCompatActivity {  private TextView timeText;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_test);    timeText = (TextView) findViewById(R.id.time_text);    //為TextView設定點擊事件    timeText.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View v) {        //將timeText傳入用於顯示所選擇的時間        showDialogPick((TextView) v);      }    });  }  //將兩個選擇時間的dialog放在該函數中  private void showDialogPick(final TextView timeText) {    final StringBuffer time = new StringBuffer();    //擷取Calendar對象,用於擷取目前時間    final Calendar calendar = Calendar.getInstance();    int year = calendar.get(Calendar.YEAR);    int month = calendar.get(Calendar.MONTH);    int day = calendar.get(Calendar.DAY_OF_MONTH);    int hour = calendar.get(Calendar.HOUR_OF_DAY);    int minute = calendar.get(Calendar.MINUTE);    //執行個體化TimePickerDialog對象    final TimePickerDialog timePickerDialog = new TimePickerDialog(TestActivity.this, new TimePickerDialog.OnTimeSetListener() {      //選擇完時間後會調用該回呼函數      @Override      public void onTimeSet(TimePicker view, int hourOfDay, int minute) {        time.append(" " + hourOfDay + ":" + minute);        //設定TextView顯示最終選擇的時間        timeText.setText(time);      }    }, hour, minute, true);    //執行個體化DatePickerDialog對象    DatePickerDialog datePickerDialog = new DatePickerDialog(TestActivity.this, new DatePickerDialog.OnDateSetListener() {      //選擇完日期後會調用該回呼函數      @Override      public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {        //因為monthOfYear會比實際月份少一月所以這邊要加1        time.append(year + "-" + (monthOfYear+1) + "-" + dayOfMonth);        //選擇完日期後彈出選擇時間對話方塊        timePickerDialog.show();      }    }, year, month, day);    //彈出選擇日期對話方塊    datePickerDialog.show();  }}

到此,點擊運行就可以看效果了:)

通過FragmentDialog使用

為什麼要用DialogFragment

      1、用DialogFragment管理對話方塊是官方推介的使用方式。

       2、使用DialogFragment管理對話方塊也方便代碼的重用。

通過FragmentDialog實現步驟

DatePickerFragment類:

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener{  private String date;  @Override  public Dialog onCreateDialog(Bundle savedInstanceState) {    //得到Calendar類執行個體,用於擷取目前時間    Calendar calendar = Calendar.getInstance();    int year = calendar.get(Calendar.YEAR);    int month = calendar.get(Calendar.MONTH);    int day = calendar.get(Calendar.DAY_OF_MONTH);    //返回DatePickerDialog對象    //因為實現了OnDateSetListener介面,所以第二個參數直接傳入this    return new DatePickerDialog(getActivity(), this, year, month, day);  }  //實現OnDateSetListener介面的onDateSet()方法  @Override  public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {    //這樣子寫就將選擇時間的fragment和選擇日期的fragment完全綁定在一起    //使用的時候只需直接調用DatePickerFragment的show()方法    //即可選擇完日期後選擇時間    TimePickerFragment timePicker = new TimePickerFragment();    timePicker.show(getFragmentManager(), "time_picker");    //將使用者選擇的日期傳到TimePickerFragment    date = year + "年" + (monthOfYear+1) + "月" + dayOfMonth + "日";    timePicker.setTime(date);  }}

TimePickerFragment類:

//實現OnTimeSetListener介面public class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener{  private String time = "";  @Override  public Dialog onCreateDialog(Bundle savedInstanceState) {    //建立日曆類用於擷取目前時間    Calendar calendar = Calendar.getInstance();    int hour = calendar.get(Calendar.HOUR_OF_DAY);    int minute = calendar.get(Calendar.MINUTE);    //返回TimePickerDialog對象    //因為實現了OnTimeSetListener介面,所以第二個參數直接傳入this    return new TimePickerDialog(getActivity(), this, hour, minute, true);  }  //實現OnTimeSetListener的onTimeSet方法  @Override  public void onTimeSet(TimePicker view, int hourOfDay, int minute) {    //判斷activity是否是DataCallBack的一個執行個體    if(getActivity() instanceof DataCallBack){      //將activity強轉為DataCallBack      DataCallBack dataCallBack = (DataCallBack) getActivity();      time = time + hourOfDay + "點" + minute + "分";      //調用activity的getData方法將資料傳回activity顯示      dataCallBack.getData(time);    }  }  public void setTime(String date){    time += date;  }}

Activity的布局檔案,只有一個TextView用於顯示時間

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"  tools:context="com.example.testdemo.TestActivityActivity">  <TextView    android:id="@+id/time_text"    android:layout_centerInParent="true"    android:text="點此選擇時間"    android:textSize="20sp"    android:layout_width="wrap_content"    android:layout_height="wrap_content" /></RelativeLayout>

Activity檔案:

//實現DataCallBack介面,實現與Fragment的通訊public class TestActivityActivity extends AppCompatActivity implements DataCallBack{  TextView timeText;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_test2);    timeText = (TextView) findViewById(R.id.time_text);    //為timeText設定點擊事件    timeText.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View v) {        //執行個體化對象        DatePickerFragment datePickerFragment = new DatePickerFragment();        //調用show方法彈出對話方塊        // 第一個參數為FragmentManager對象        // 第二個為調用該方法的fragment的標籤        datePickerFragment.show(getFragmentManager(), "date_picker");      }    });  }  //實現DataCallBack的getData方法  @Override  public void getData(String data) {    //data即為fragment調用該函數傳回的日期時間    timeText.setText(data);  }}

由於TimePickerFragment對話方塊是在DatePickerFragment類裡面啟動的,所以這樣寫只能日期和時間都選擇,如果要單獨選擇日期或者時間,只需要重寫onTimeSet()或者onDateSet()方法即可

相容性問題

不同的android版本顯示的效果不同,在android6.0效果很好,不過在一些低版本android(如4.0,筆者沒有每個版本都測試)會出現調用兩次回掉函數的情況,導致選擇兩次時間。解決的辦法有很多,只要保證回呼函數裡面的邏輯只執行一次就可以。這裡提供一種比較通用的方法。

重寫TimePickerDialog和DatePickerDialog的onStop()方法

直接在Activity中使用的重寫方法

final TimePickerDialog timePickerDialog = new TimePickerDialog(TestActivity.this, new TimePickerDialog.OnTimeSetListener() {      //選擇完時間後會調用該回呼函數      @Override      public void onTimeSet(TimePicker view, int hourOfDay, int minute) {        time.append(" " + hourOfDay + ":" + minute);        //設定TextView顯示最終選擇的時間        timeText.setText(time);      }    }, hour, minute, true){     // 重寫onStop()      @Override      protected void onStop() {      }    };    //執行個體化DatePickerDialog對象    DatePickerDialog datePickerDialog = new DatePickerDialog(TestActivity.this, new DatePickerDialog.OnDateSetListener() {      //選擇完日期後會調用該回呼函數      @Override      public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {        //因為monthOfYear會比實際月份少一月所以這邊要加1        time.append(year + "-" + (monthOfYear+1) + "-" + dayOfMonth);        //選擇完日期後彈出選擇時間對話方塊        timePickerDialog.show();      }    }, year, month, day){      //重寫onstop      @Override      protected void onStop() {      }    };

上面的寫法看起來會比較亂,也可以另外建立一個類繼承TimePickerDialog或者DatePickerDialog然後重寫onStop()方法

通過FragmentDialog使用的重寫方式

只需在onCreateDialog()方法裡面重寫即可,下面的代碼會比較清晰

return new DatePickerDialog(getActivity(), this, year, month, day){      // 重寫onStop      @Override      protected void onStop() {      }    };
 return new TimePickerDialog(getActivity(), this, hour, minute, true){      //重寫onStop      @Override      protected void onStop() {      }    };

總結

筆者水平有限,但是保證以上代碼都是親手實現過一遍的。如果有什麼不足之處歡迎大家指出,以上就是本文的全部內容,希望對大家開發Android能有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.