2013-08-13 24 views
8

Theo tài liệu chính thức http://developer.android.com/guide/topics/ui/controls/pickers.html#DatePicker.Làm cách nào để chuyển chuỗi ngày được định dạng khỏi DatePickerFragment của tôi?

Tôi đã sử dụng chỉ cùng mã, và thêm vào chỉ là kết quả định dạng trong onDateSet phương pháp:

public class DatePickerFragment extends DialogFragment 
          implements DatePickerDialog.OnDateSetListener { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     // Use the current date as the default date in the picker 
     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); 

     // Create a new instance of DatePickerDialog and return it 
     return new DatePickerDialog(getActivity(), this, year, month, day); 
    } 

    @Override 
    public void onDateSet(DatePicker view, int year, int month, int day) { 
     Calendar c = Calendar.getInstance(); 
     c.set(year, month, day); 

     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
     String formattedDate = sdf.format(c.getTime()); 

     // How to get the string from here to the caller? 

    } 
} 

Để thử nghiệm, hoạt động người gọi chỉ hiển thị TextView và gọi chọn khi người dùng chạm vào widget :

public class OrderHeadEditActivity extends Activity { 

    private TextView mDTDelivery; 
    ... 

    @Override 
    protected void onCreate(Bundle bundle) { 
     ... 
     mDTDelivery = (TextView) findViewById(R.id.order_head_view_dt_delivery); 
     ... 
     mDTDelivery.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       DialogFragment picker = new DatePickerFragment(); 
       picker.show(getFragmentManager(), "datePicker"); 
      } 
     }); 
    } 
... 
} 

Bộ chọn ngày được hiển thị và sau khi đặt điểm ngắt tại nơi kết quả được định dạng thành chuỗi, tôi có thể thấy nó hoạt động.

Tuy nhiên, tôi không biết cách chuyển giá trị chuỗi trở lại tiện ích mtDTDelivery?

+0

làm cho lớp dữ liệu của bạn trở thành lớp bên trong của lớp hoạt động của bạn – Raghunandan

+0

bạn đã thử dưới đây chưa? phương thức giao diện sẽ hoạt động. – Raghunandan

+0

Tôi chưa thử. Tôi sẽ thử sau ngày hôm nay. Tôi muốn hiểu nó trước. (Tôi mới sử dụng Java và các lần lặp của nó và cũng mới đối với Android.) – pepr

Trả lời

14

Như tyczj chỉ ra bạn có thể sử dụng phương pháp giao diện hoặc bạn có thể làm datapicker lớp một lớp bên trong của lớp hoạt động của bạn trong trường hợp này nó phải được tĩnh và bạn cần một WeakReference của outerclass

Sử dụng giao diện.

Xác định giao diện trong DatePickerFragment. Triển khai giao diện trong lớp hoạt động của bạn và đặt ngày thành dạng xem văn bản.

public class DatePickerFragment extends DialogFragment 
implements DatePickerDialog.OnDateSetListener { 

    TheListener listener; 

public interface TheListener{ 
    public void returnDate(String date); 
} 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
// Use the current date as the default date in the picker 
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); 
listener = (TheListener) getActivity(); 

// Create a new instance of DatePickerDialog and return it 
return new DatePickerDialog(getActivity(), this, year, month, day); 
} 

@Override 
public void onDateSet(DatePicker view, int year, int month, int day) { 
Calendar c = Calendar.getInstance(); 
c.set(year, month, day); 

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
String formattedDate = sdf.format(c.getTime()); 
if (listener != null) 
{ 
    listener.returnDate(formattedDate); 

} 

} 
} 

MainActivity

public class MainActivity extends Activity implements DatePickerFragment.TheListener{ 

    Button b; 
    TextView tv; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     b= (Button) findViewById(R.id.button1); 
     tv= (TextView) findViewById(R.id.textView1); 
     b.setOnClickListener(new OnClickListener() 
     { 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
       DialogFragment picker = new DatePickerFragment(); 
       picker.show(getFragmentManager(), "datePicker"); 
      } 

     }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public void returnDate(String date) { 
     // TODO Auto-generated method stub 
     tv.setText(date); 
    } 

} 

cách thứ hai không chắc chắn nếu điều này là cách tốt nhất. Tôi muốn giới thiệu phương thức giao diện ở trên.

public class MainActivity extends Activity {//implements DatePickerFragment.TheListener{ 

    Button b; 
    TextView tv; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     b= (Button) findViewById(R.id.button1); 
     tv= (TextView) findViewById(R.id.textView1); 
     b.setOnClickListener(new OnClickListener() 
     { 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
       DialogFragment picker = new DatePickerFragment(); 
       picker.show(getFragmentManager(), "datePicker"); 
      } 

     }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 


    public static class DatePickerFragment extends DialogFragment 
    implements DatePickerDialog.OnDateSetListener { 

     private WeakReference<MainActivity> mActivity; 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
    // Use the current date as the default date in the picker 
    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); 
    mActivity = new WeakReference<MainActivity>((MainActivity) getActivity()); 

    // Create a new instance of DatePickerDialog and return it 
    return new DatePickerDialog(getActivity(), this, year, month, day); 
    } 

    @Override 
    public void onDateSet(DatePicker view, int year, int month, int day) { 
    Calendar c = Calendar.getInstance(); 
    c.set(year, month, day); 

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
    String formattedDate = sdf.format(c.getTime()); 
     MainActivity target = mActivity.get(); 
     if (target != null) target.tv.setText(formattedDate); 

    } 
    } 
} 
+1

Tôi phải nghiên cứu thêm một chút. Dù sao, làm thế nào nó xảy ra 'listener' trong' DatePickerFragment' nhận giá trị không null của nó? – pepr

+0

bạn xác định giao diện trong 'DatePickerFragment'. Sau đó, triển khai giao diện trong lớp hoạt động của bạn. Bạn đặt giá trị cho phương thức giao diện. Vì lớp hoạt động của bạn triển khai giao diện, bạn sẽ nhận được giá trị ở đó. Kiểm tra chủ đề ** Tạo gọi lại sự kiện cho hoạt động ** http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity – Raghunandan

+0

@pepr để biết về giao diện. http://docs.oracle.com/javase/tutorial/java/concepts/interface.html – Raghunandan

4

Cách thích hợp là tạo một cuộc gọi lại đến hoạt động truyền chuỗi.

hãy nhìn vào Communicating with an Activity

+0

+1 Cảm ơn bạn đã liên kết. – pepr

+0

Chính xác những gì tôi đang tìm kiếm. Cảm ơn! – ChrisG

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