6

używam DialogFragment pokazać DatePicker gdy użytkownik kliknie EditTextJak pokazują wybranej daty w EditText użyciu DialogFragment

Jak mogę pokazać wybraną datę w tym samym EditText.

Używam jako odniesienia odniesienia this.

DatePickerFragment.java:

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 monthOfYear, int dayOfMonth) { 
     Calendar c = Calendar.getInstance(); 
     c.set(year, monthOfYear, dayOfMonth); 

     SimpleDateFormat sdf = new SimpleDateFormat("dd MMMM yyyy"); 
     String formattedDate = sdf.format(c.getTime()); 
     Toast.makeText(getActivity(), formattedDate, Toast.LENGTH_LONG).show(); 
    } 

} 

fragment:

editDate.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       android.support.v4.app.DialogFragment dialogFragment = new DatePickerFragment(); 
       dialogFragment.show(getFragmentManager(), "datePicker"); 
      } 
     }); 

Kiedy dotknij EditText, pokazuje DatePicker i wybranej daty w Toast. Ale nie mogę wymyślić, jak pokazać tę datę w EditText?

+0

jaki problem napotykasz w rzeczywistości? – Amy

+0

Nie wiem, jak wyświetlić wybraną datę w EditText .. – Oreo

Odpowiedz

4

Na podstawie struktury klasowej, najlepszym sposobem jest do Utwórz konstruktor z EditText jako parametr.

private EditText mEditText; 
... 
public DatePickerFragment(EditText editText) 
{ 
    mEditText = editText; 
} 

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

    SimpleDateFormat sdf = new SimpleDateFormat("dd MMMM yyyy"); 
    String formattedDate = sdf.format(c.getTime()); 
    Toast.makeText(getActivity(), formattedDate, Toast.LENGTH_LONG).show(); 

    mEditText.setText(formattedDate); 
} 

Następnie należy podać parametr editDate podczas tworzenia instancji klasy wyboru okna dialogowego.

public void onClick(View v) 
{ 
    android.support.v4.app.DialogFragment dialogFragment = new DatePickerFragment(editDate); 
dialogFragment.show(getFragmentManager(), "datePicker"); 
} 

Innym rozwiązaniem jest usunięcie DatePickerDialog.OnDateSetListener z DatePickerFragment i wdrożenie słuchacza w was fragmentu.

public class OtherFragment extends Fragment 
     implements DatePickerDialog.OnDateSetListener 
{ 
    @Override 
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
     Calendar c = Calendar.getInstance(); 
     c.set(year, monthOfYear, dayOfMonth); 

     SimpleDateFormat sdf = new SimpleDateFormat("dd MMMM yyyy"); 
     String formattedDate = sdf.format(c.getTime()); 
     Toast.makeText(getActivity(), formattedDate, Toast.LENGTH_LONG).show(); 
     editDate.setText(formattedDate); 
    } 
} 
+0

Nowsza wersja Androida SDK zmusza do uzyskania pustego konstruktora no-args. Sprawdź ten problem: http: // stackoverflow.com/questions/29762949/error-this-fragment-should-provide-a-default-constructor-a-public-constructor – Oreo

+0

Uruchomiłem ten problem wcześniej. To naprawdę tylko ostrzeżenie. Jeśli chcesz go usunąć, dodaj kolejny konstruktor bez argumentu i wywołaj super(); wewnątrz konstruktora. –

+0

To tylko ochrona, na wypadek gdybyś użył tej klasy w układzie XML, gdzie użyje domyślnego konstruktora do utworzenia instancji twojego obiektu, gdy XML jest zawyżony. Możemy tworzyć różne konstruktory dla naszych klas, o ile wiemy, co robimy. –

0

Wystarczy zastąpić to:

Toast.makeText(getActivity(), formattedDate, Toast.LENGTH_LONG).show(); 

linii lub wprowadzić tę linię, aby wyświetlić datę w swoim EditText:

EditText date=(EditText)find(...); 
date.setText(formattedDate); 
+0

ale używam EditText w Fragment, a sformatowanyData jest w DatePickerFragment.java – Oreo

1

można zrobić coś takiego -

EditText edttxt_date = (EditText) findViewById(R.id.date); 
edttxt_date.setText(formattedDate); 
Toast.makeText(getBaseContext(), formattedDate, Toast.LENGTH_SHORT).show(); 

lub można użyć kalendarz i DatePickerDialogFragment zbyt wyświetlanie czasu coś takiego i zwróci odpowiednią wartość dla fragmentu.

DateFormat dateFormat = DateFormat.getDateInstance(); 
edttxt_date.setText(dateFormat.format(cal.getTime())); 

Mam nadzieję, że to pomoże!

0

Dodaj klasę DatePickerFragment wewnątrz klasy MainFragment. Po wywołaniu publicznego void onDateSet() wywołaj metodę w tej samej klasie, aby zaktualizować pole editText.

public MainFragment extents Fragment{ 

     ..... 
     updateDateField(String formattedDate){ 
       editDate.setText(formattedDate); 
     } 

     public class DatePickerFragment extends DialogFragment 
        implements DatePickerDialog.OnDateSetListener { 
.... 
      @Override 
      public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
       Calendar c = Calendar.getInstance(); 
       c.set(year, monthOfYear, dayOfMonth); 

       SimpleDateFormat sdf = new SimpleDateFormat("dd MMMM yyyy"); 
           String formattedDate = sdf.format(c.getTime()); 
           updateDateField(formattedDate); 
      } 
     } 
    } 
+0

mam próbowałem na swój sposób, ale otrzymuję: Błąd: (121) Błąd: Ta wewnętrzna klasa fragmentu powinna być statyczna (MainFragment.DatePickerFragment) [ValidFragment] – Oreo

+0

Postaraj się, aby DatePickerFragment był statyczny – Rakhi

+0

Spróbuj użyć Callback Listenera. Napisz DatePickerFragment jako nową klasę. – Rakhi