2013-08-13 9 views
8

Po oficjalnym dokumencie http://developer.android.com/guide/topics/ui/controls/pickers.html#DatePicker.Jak przenieść sformatowany ciąg daty z mojego pliku DatePickerFragment?

Użyłem tylko ten sam kod i dodał tylko wynik formatowania w metodzie onDateSet:

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? 

    } 
} 

Do testowania aktywności rozmówcy po prostu wyświetla TextView i wywołuje próbnika, gdy użytkownik dotyka widget : wyświetlany jest

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

data kompletacji, a po ustawieniu punktu przerwania w miejscu, gdzie wynik jest sformatowany na sznurku, widzę to działa.

Jednak nie wiem, jak przekazać wartość ciągu z powrotem do widżetu mtDTDelivery?

+0

uczynić swoją klasę datapicker wewnętrzną klasą swojej klasy aktywności – Raghunandan

+0

wypróbowałeś poniższe?. metoda interfejsu zadziała. – Raghunandan

+0

Jeszcze nie próbowałem. Spróbuję później dzisiaj. Chciałbym to najpierw zrozumieć. (Jestem nowy w Javie i jej iterfaces, a także nowościach w systemie Android.) – pepr

Odpowiedz

14

Jak tyczj wskazał, można użyć metody interfejsu lub można zrobić datapicker klasa wewnętrzna klasa klasie aktywności w tym przypadku powinno być statyczne i trzeba WeakReference z następujących Klasa zewnętrzna

Korzystanie z interfejsu.

Definiowanie interfejsu w DatePickerFragment. Zaimplementuj interfejs w swojej klasie aktywności i ustaw datę na tekst.

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

} 

} 
} 

główną działalność

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

} 

Drugi sposób nie jestem pewien, czy jest to najlepszy sposób. Polecam powyższą metodę interfejsu.

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

Muszę się trochę uczyć. W każdym razie, jak to się dzieje, że 'listener' w' DatePickerFragment' dostaje jego wartość inną niż null? – pepr

+0

definiujesz interfejs w 'DatePickerFragment'. Następnie zaimplementuj interfejs w swojej klasie aktywności. Ustawia się wartość dla metody interfejsu. Ponieważ twoja klasa aktywności implementuje interfejs, dostajesz tam wartość. Sprawdź temat ** Tworzenie wywołań zwrotnych zdarzeń do działania ** http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity – Raghunandan

+0

@pepr, aby dowiedzieć się więcej o interfejsie. http://docs.oracle.com/javase/tutorial/java/concepts/interface.html – Raghunandan

Powiązane problemy