2012-08-01 16 views
14

Obserwuję tutorial tutaj: http://developer.android.com/guide/topics/ui/controls/pickers.htmlFragment Datepikera Androida - jak coś zrobić, gdy użytkownik ustawi datę?

mam rzeczy do pracy i datepicker zjawia. Jednak utknąłem na tym, jak postępować, gdy użytkownik ustawi datę.

widzę mają tą metodą:

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

jednak, że nic nie robi, jeśli mogę umieścić dowolny kod w nim.

Nie jestem zaznajomiony z Javą, więc nie jestem pewien, jaki dodatkowy kod jest potrzebny, aby zaktualizować tekst z wybraną datą.

zrobiłem dodać ten kod:

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)); 
} 

jednak, że nic nie robi.

znalazłem prawie dokładnie na to pytanie: Get date from datepicker using dialogfragment

Jednak w tym roztworze nie stosując (EditSessionActivity) ograniczyć klasę DatePickerFragment do pracy tylko z EditSessionActivity?

Odpowiedz

9

Powinieneś użyć statycznej fabryki do przekazania argumentów do DialogFragment. Od "docs,

" Każdy fragment musi mieć pusty konstruktor, aby można go było utworzyć podczas przywracania jego stanu aktywności. Zaleca się, aby podklasy nie miały innych konstruktorów z parametrami, ponieważ konstruktory te nie będą wywoływane, gdy fragment jest ponownie instancjonowany, zamiast tego argumenty mogą być dostarczane przez wywołującego za pomocą zestawu setArguments (Bundle), a następnie pobierane przez Fragment za pomocą funkcji getArguments(). "

Podobnie podklasa Fragment powinna być statyczna, aby mogła ponownie utworzyć instancję bez polegania na działaniu macierzystym lub Fragmentie. Jeśli nie zastosujesz się do tych wskazówek, czasami pojawią się awarie lub błędy, gdy Twój Fragment podejmie próbę wznowienia.

Zalecanym sposobem zbudowania DialogFragment, z Androidem docs, jest użycie statycznej metody fabrycznej. Oto przykład fragmentu Date Picker, które odbywają się w początkowej daty i 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)}; 
    } 
} 

Następnie można utworzyć jedną z tych fragmentów dialogowych następująco:

DatePickerFragment.newInstance(yourDate, yourOnDateSetListener); 
+1

Może warto dodać, że okno wyskakuje jeśli najpierw instancję fragment, a następnie użyć jej „pokaz () 'metoda, aby pojawiła się na ekranie. –

2

wierzę, można użyć DialogFragments tutaj:

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

określić DatePickerFragment i wdrożenie metody poniżej

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); 
} 

pobrana z Android DialogFragment Example.

1

Z mojego doświadczenia wynika, że ​​ten kod działa doskonale !, Używam 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);}} 

} 

Mam „TextView txtDate” i „przycisk z onclick =” datepicker

Powiązane problemy