2011-07-12 26 views

Trả lời

4

Bạn rất có thể sẽ cần sử dụng DialogFragment. Tôi tìm thấy một số thông tin ở đây:

Show dialog from fragment?

và cũng là một trợ giúp lớn ở đây:

https://github.com/commonsguy/cw-advandroid/blob/master/Honeycomb/FeedFragments/src/com/commonsware/android/feedfrags/AddFeedDialogFragment.java

Điều này sẽ giúp bạn nhận được trên con đường của bạn, tôi đang làm điều này rất bây giờ. Mặc dù bên trong mã ví dụ tôi không sử dụng một người thợ xây và thay vào đó chỉ cần trả lại:

return new DatePickerDialog(getActivity(), mDateSetListener, mYear, mMonth, mDay); 

Điều này dường như làm việc ... mặc dù tôi không thể tìm ra được nêu ra như thế nào để cập nhật các văn bản trên đoạn mà các cuộc gọi DialogFragment này. Tôi nghĩ điều này sẽ làm việc và nó không:

public void updateDisplay() 
{ 
    //update our button text from the calling fragment, this isn't quite working 
    //doesn't crash just doesn't update...must be missing something. 
    View v=getActivity() 
     .getLayoutInflater() 
     .inflate(R.layout.session_edits, null); 
    Button sessionDate = (Button)v.findViewById(R.id.sessionPickDate); 
      sessionDate.setText(new StringBuilder() 
          .append(mMonth+1).append("-").append(mDay).append("-").append(mYear).append(" ")); 

} 
22

Mở rộng trên Codejoy của câu trả lời:

Đây là lớp DatePickerDialogFragment tôi:

public class DatePickerDialogFragment extends DialogFragment { 
    private Fragment mFragment; 

    public DatePickerDialogFragment(Fragment callback) { 
     mFragment = callback; 
    } 

    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     return new DatePickerDialog(getActivity(), (OnDateSetListener) mFragment, 1980, 7, 16); 
    } 
} 

(Chú ý rằng các nhà xây dựng chấp nhận đoạn đó là sử dụng hộp thoại này - và chúng tôi sử dụng tham chiếu này cho trường nghe gọi lại cho DatePickerDialog)

Đoạn của tôi sau đó chỉ thực hiện trênDateSetListener:

public class SignupFragment extends Fragment implements OnDateSetListener { 
... 
public void onDateSet(DatePicker view, int year, int monthOfYear, 
      int dayOfMonth) { 
    // do stuff with the date the user selected 
} 
} 

... và sau đó tôi hiển thị hộp thoại từ Fragment tôi như vậy:

FragmentTransaction ft = getFragmentManager().beginTransaction(); 
DialogFragment newFragment = new DatePickerDialogFragment(this); 
newFragment.show(ft, "dialog"); 

Không chắc nếu điều này là cách tốt nhất để làm điều đó, nhưng dường như làm việc tốt.

+0

Bạn sử dụng "vị trí" ở đâu? –

+0

Tôi có một văn bản cần có ngày tháng. Tôi đã đặt onClicklistener từ văn bản này để mở đoạn này theo cách bạn đã làm, và nó đang hoạt động. Vấn đề là bàn phím cũng mở ra. Làm thế nào tôi có thể giải quyết điều đó? Cảm ơn bạn –

+0

@PauloBarros "prev" là xóa mọi đoạn trước trên màn hình bằng thẻ này (chẳng hạn như một hộp thoại khác), nhưng không được sử dụng trong ví dụ này. Tôi đã cập nhật mã để không có nó. – NPike

5

Anwsers trước đây giải thích đủ tốt nhưng đây là cách tôi đã thay đổi chế độ xem trênDateSet của DialogFragment.

Bạn có thể chuyển chế độ xem bạn muốn thay đổi thành cấu trúc của lớp mở rộng DialogFragment. Sau đó gọi phương thức setText method onDateSet của lớp. Đây là mã:

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { 

public EditText activity_edittext; 

public DatePickerFragment(EditText edit_text) { 
    activity_edittext = edit_text; 
} 

@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) { 
     activity_edittext.setText(String.valueOf(month + 1) + "/" + String.valueOf(day) + "/" + String.valueOf(year)); 
    } 
} 

Sau đó, bạn có thể hiển thị đoạn của bạn như thế này:

public void showDatePickerDialog(View v) { 
    new DatePickerFragment((EditText) v).show(getSupportFragmentManager(), "datePicker"); 
} 

Đặt phương pháp này onClick phương pháp EditText bạn muốn thay đổi.Như thế này:

<EditText 
      android:id="@+id/editTextToShowDate" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:ems="10" 
      android:focusable="false" 
      android:inputType="date" 
      android:onClick="showDatePickerDialog" > 
    </EditText> 
+0

hoạt động. !! cảm ơn u –

17

Mặc dù câu trả lời ở trên có thể làm việc, tôi tin rằng tôi có một giải pháp dễ dàng hơn nhiều:

DatePickerDialog dialog = new DatePickerDialog(getActivity(), datePickerListener, 
          2000, 1,1); 
dialog.show(); 

đâu datePickerListerener là một cái gì đó như thế này:

private DatePickerDialog.OnDateSetListener datePickerListener 
      = new DatePickerDialog.OnDateSetListener() { 

     // when dialog box is closed, below method will be called. 
     public void onDateSet(DatePicker view, int selectedYear, 
      int selectedMonth, int selectedDay) { 
      //Do whatever you want 
     } 
}; 
+0

Câu trả lời hay, cảm ơn –

+0

Đơn giản và hiệu quả. Hoạt động tốt với TimePickerDialog quá. – bob

+0

Cảm ơn bạn .. Tôi chỉ yêu u .. Chỉ cần 2 dòng kết thúc quá khứ của tôi 4 giờ nghiên cứu .. Làm thế nào ngu ngốc Iam .. – Sayka

1

Dưới đây là một đoạn muốn sử dụng datepicker trong một đoạn:

private Callbacks mCallbacks; 
private String tag; 

/** 
* A callback interface that all fragments/activities containing this fragment must 
* implement. This mechanism allows activities to be notified of item 
* selections. 
*/ 
public interface Callbacks { 
    /** 
    * Callback for when an item has been selected. 
    */ 
    public void onSelected(Date date, String tag); 
} 





    public static DatePickerFragment newInstance(Fragment fragment, 
               Date date, String tag)   { 
    DatePickerFragment dateFragment = new DatePickerFragment(); 
    Calendar c = Calendar.getInstance(); 
    if (date != null) { 
     c.setTime(date); 
    } 
    dateFragment.setYear(c.get(Calendar.YEAR)); 
    dateFragment.setMonth(c.get(Calendar.MONTH)); 
    dateFragment.setDay(c.get(Calendar.DAY_OF_MONTH)); 
    dateFragment.setmCallbacks((Callbacks) fragment); 
    dateFragment.setTag(tag); 
    return dateFragment; 
} 

public void onDateSet(DatePicker view, int year, int month, int day) { 
    // Do something with the date chosen by the user 
    Calendar cal = Calendar.getInstance(); 
    cal.set(year, month, day); 
    date = new Date(cal.getTime().getTime()); 
    setType(1); 
    mCallbacks.onSelected(date,tag); 
} 

và trong đoạn của bạn:

public class DetailFragment extends Fragment implements 
    DatePickerFragment.Callbacks { 

. . .

private void startDatePicker(String tag) { 

    DialogFragment newFragment = DatePickerFragment.newInstance(this, 
      invoiceModell.getInvoice().getInvoiceDate(), tag); 
    newFragment.show(getActivity().getSupportFragmentManager(), 
      "datePicker"); 
} 


    @Override 
public void onSelected(Date date, String tag) { 
    if (tag.equals(FIRSTDATE)) 
     invoiceModell.getInvoice().setInvoiceDate(date); 
    else if (tag.equals(SECONDDATE)) 
     invoiceModell.getInvoice().setDueDate(date); 
} 
Các vấn đề liên quan