2012-08-01 26 views
14

Tôi đang làm theo hướng dẫn tại đây: http://developer.android.com/guide/topics/ui/controls/pickers.htmlFragment Datepicker Android - Làm thế nào để làm điều gì đó khi người dùng thiết lập một ngày?

Tôi có mọi thứ để hoạt động và trình hiển thị ngày xuất hiện. Tuy nhiên, tôi bị mắc kẹt về cách hành động khi người dùng đặt ngày.

tôi thấy họ có phương pháp này:

public void onDateSet(DatePicker view, int year, int month, int day) { 
    // Do something with the date chosen by the user 
} 

Nhưng điều đó không có gì nếu tôi đặt bất kỳ mã trong đó.

Tôi không quen với Java nên tôi không chắc chắn cần thêm mã nào để cập nhật một lần xem văn bản với ngày đã chọn.

tôi đã thêm mã này:

private DatePickerDialog.OnDateSetListener mDateListener = 
     new DatePickerDialog.OnDateSetListener() { 
      public void onDateSet(DatePicker view, int year, int month, int day) { 
       updateDate(year, month, day); 
      } 
     }; 

public void updateDate(int year, int month, int day) { 
    TextView bdate = (TextView)findViewById(R.id.birthDate); 
    Date chosenDate = new Date(year, month, day); 
    java.text.DateFormat dateFormat = DateFormat.getDateFormat(getApplicationContext()); 
    bdate.setText(dateFormat.format(chosenDate)); 
} 

Nhưng điều đó không có gì.

tôi đã tìm thấy câu hỏi gần như chính xác này: Get date from datepicker using dialogfragment

Tuy nhiên trong dung dịch đó sẽ không sử dụng (EditSessionActivity) hạn chế lớp DatePickerFragment được làm việc với chỉ EditSessionActivity?

Trả lời

9

Bạn nên sử dụng một nhà máy tĩnh để chuyển đối số cho DialogFragment. Từ docs,

"Mỗi đoạn phải có một hàm tạo rỗng, vì vậy nó có thể được khởi tạo khi khôi phục trạng thái hoạt động của nó. Chúng tôi khuyên các lớp con không có các hàm tạo khác với tham số, vì các hàm tạo này sẽ không được gọi khi đoạn này được tái khởi tạo, thay vào đó, các đối số có thể được cung cấp bởi người gọi với setArguments (Bundle) và sau đó được lấy bởi Fragment với getArguments(). "

Tương tự, phân lớp Phân đoạn phải tĩnh, sao cho phân lớp có thể tự khởi tạo lại mà không dựa vào hoạt động gốc hoặc Phân đoạn. Nếu bạn không tuân thủ các nguyên tắc này, đôi khi bạn sẽ gặp sự cố hoặc lỗi khi Fragment của bạn cố gắng tiếp tục.

Cách được khuyến nghị để xây dựng DialogFragment, từ Android docs, là sử dụng phương pháp nhà máy tĩnh. Dưới đây là một ví dụ về một đoạn bảng chọn ngày mà mất trong một ngày ban đầu và một OnDateChangedListener:

public static class DatePickerFragment extends DialogFragment{ 

    private OnDateSetListener onDateSetListener; 

    static DatePickerFragment newInstance(Date date, OnDateSetListener onDateSetListener) { 
     DatePickerFragment pickerFragment = new DatePickerFragment(); 
     pickerFragment.setOnDateSetListener(onDateSetListener); 

     //Pass the date in a bundle. 
     Bundle bundle = new Bundle(); 
     bundle.putSerializable(MOVE_IN_DATE_KEY, date); 
     pickerFragment.setArguments(bundle); 
     return pickerFragment; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     super.onCreateDialog(savedInstanceState); 

     Date initialDate = (Date) getArguments().getSerializable(MOVE_IN_DATE_KEY); 
     int[] yearMonthDay = ymdTripleFor(initialDate); 
     DatePickerDialog dialog = new DatePickerDialog(getActivity(), onDateSetListener, yearMonthDay[0], yearMonthDay[1], 
       yearMonthDay[2]); 
     return dialog; 
    } 

    private void setOnDateSetListener(OnDateSetListener listener) { 
     this.onDateSetListener = listener; 
    } 

    private int[] ymdTripleFor(Date date) { 
     Calendar cal = Calendar.getInstance(Locale.US); 
     cal.setTime(date); 
     return new int[]{cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH)}; 
    } 
} 

Sau đó bạn có thể tạo ra một trong những mảnh vỡ hộp thoại như sau:

DatePickerFragment.newInstance(yourDate, yourOnDateSetListener); 
+1

Có lẽ bạn nên thêm, rằng hộp thoại bật lên nếu bạn đầu tiên nhanh chóng các đoạn và sau đó sử dụng 'hiển thị của nó () 'phương pháp để làm cho nó xuất hiện trên màn hình. –

2

Tôi tin rằng người ta có thể sử dụng DialogFragments đây:

DialogFragment newFragment = new DatePickerFragment(); 
newFragment.show(getSupportFragmentManager(), "datePicker"); 

xác định DatePickerFragment và thực hiện các phương pháp dưới đây

public void onDateSet(DatePicker view, int year, int month, int day) { 
// Do something with the date chosen by the user 
DateEdit.setText(day + "/" + (month + 1) + "/" + year); 
} 

được lấy từ Android DialogFragment Example.

1

trong kinh nghiệm của tôi mã này hoạt động hoàn hảo !, Tôi đang sử dụng win10 Android Studio 2.2 ...

import android.app.Dialog; 
import android.support.v4.app.DialogFragment; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.app.DatePickerDialog; 
import android.widget.DatePicker; 
import android.widget.EditText; 
import java.util.Calendar; 


public class MainActivity extends AppCompatActivity implements DatePickerDialog.OnDateSetListener{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main);} 

    public void datePicker(View view){ 
     DatePickerFragment fragment_date = new DatePickerFragment(); 
     fragment_date.show(getSupportFragmentManager(),"datePicker");} 

    @Override 
    public void onDateSet(DatePicker view, int year, int month, int day) { 
     String day_x = ""+ day ,month_x = ""+(month+1); 
     if (day < 9){ day_x = "0" + day_x;} 
     if (month < 9){ month_x = "0" + month_x;} 
     ((EditText) findViewById(R.id.txtDate)).setText(day_x + "/" + month_x + "/" + year);} 

    public static class DatePickerFragment extends DialogFragment { 
     @Override 
     public Dialog onCreateDialog (Bundle savedInstanceState){ 
      final Calendar c = Calendar.getInstance(); 
      int year = c .get(Calendar.YEAR); 
      int month = c .get(Calendar.MONTH); 
      int day = c .get(Calendar.DAY_OF_MONTH); 
      return new DatePickerDialog(getActivity() ,(DatePickerDialog.OnDateSetListener)this,day,month,year);}} 

} 

tôi đã là một "TextView txtDate" và một "nút với onclick = datepicker"

Các vấn đề liên quan