2016-02-25 7 views
3

Я делаю сборщик DateTime, чтобы получить фрагмент timePicker сразу после того, как я выбрал дату на фрагменте datePicker и получить объект Calendar из сборщиков.DateTimePicker android

DatePicker Фрагмент

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

    public void onDateSet(DatePicker view, int year, int month, int day) { 

    } 

} 

TimePicker фрагмент

public class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener 
{ 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    { 
     final Calendar c=Calendar.getInstance(); 
     int hour=c.get(Calendar.HOUR_OF_DAY); 
     int minute=c.get(Calendar.MINUTE); 
     return new TimePickerDialog(getActivity(),this,hour,minute, DateFormat.is24HourFormat(getActivity())); 
    } 

    @Override 
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 

    } 
} 

Как подключить эти фрагмент, чтобы показать друг за другом, и как я могу получить один объект календаря после получения данных из обоих фрагментов?

ответ

2

Попробуйте это:

MainActivity.java

public class MainActivity extends AppCompatActivity implements 
     DatePickerFragment.DatePickerListener, TimePickerFragment.TimePickerListener 
{ 
    private Calendar calendar; 
    FragmentManager fm; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     calendar = Calendar.getInstance(); 

     fm = getSupportFragmentManager(); 
     DatePickerFragment dateDialog = new DatePickerFragment(); 
     dateDialog.show(fm, "fragment_date"); 
    } 

    @Override 
    public void onDateSet(int year, int month, int day) 
    { 
     // Set selected year, month and day in calendar object 
     calendar.set(year, month, day); 

     // Start Time dialog 
     TimePickerFragment timeDialog = new TimePickerFragment(); 
     timeDialog.show(fm, "fragment_time"); 

    } 

    @Override 
    public void onTimeSet(int hourOfDay, int minute) 
    { 
     calendar.set(Calendar.HOUR_OF_DAY, hourOfDay); 
     calendar.set(Calendar.MINUTE, minute); 

     // Here, your calendar object is ready. 
    } 
} 

DatePickerFragment.java

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener 
{ 
    public interface DatePickerListener 
    { 
     public void onDateSet(int year, int month, int day); 
    } 

    private DatePickerListener listener; 

    @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 onAttach(Activity activity) 
    { 
     super.onAttach(activity); 

     // This makes sure that the container activity has implemented 
     // the callback interface. If not, it throws an exception 
     try { 
      listener = (DatePickerListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement OnHeadlineSelectedListener"); 
     } 
    } 

    public void onDateSet(DatePicker view, int year, int month, int day) 
    { 
     listener.onDateSet(year, month, day); 
    } 
} 

TimePickerFragment.java

public class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener 
{ 
    public interface TimePickerListener 
    { 
     public void onTimeSet(int hourOfDay, int minute); 
    } 

    private TimePickerListener listener; 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    { 
     final Calendar c=Calendar.getInstance(); 
     int hour=c.get(Calendar.HOUR_OF_DAY); 
     int minute=c.get(Calendar.MINUTE); 
     return new TimePickerDialog(getActivity(),this,hour,minute, DateFormat.is24HourFormat(getActivity())); 
    } 

    @Override 
    public void onAttach(Activity activity) 
    { 
     super.onAttach(activity); 

     // This makes sure that the container activity has implemented 
     // the callback interface. If not, it throws an exception 
     try { 
      listener = (TimePickerListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement OnHeadlineSelectedListener"); 
     } 
    } 

    @Override 
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) 
    { 
     listener.onTimeSet(hourOfDay, minute); 
    } 
} 

Надеюсь, что это решит вашу проблему.

1
public class myDateObject { 
     int year; 
     int month; 
     int day; 

     public myDateObject(int year, int month, int day) { 
      this.year = year; 
      this.month = month; 
      this.day = day; 
     } 
    } 

     public class MainActivity extends AppCompatActivity{ 
      MyDateObject myDate; 
      @Override 
      protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_main); 

       yourButton.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         if(myDate!=null){ 
         FragmentTransaction ft =   
         getSupportFragmentManager().beginTransaction(); 
         Fragment fragment = YourFragment.newInstance(myDate); 
         ft.replace(R.id.comments_fragment, fragment); 
         ft.commit(); 
         } 
        } 
       }); 
      } 

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

      public void onDateSet(DatePicker view, int year, int month, int day) { 
       myDate = new MyDateObject(year, month, day); 
      } 

     } 
    } 

    public class YourFragment extends Fragment { 

     public YourFragment newInstance(MyDateObject myDate) { 
      Bundle bundle = new Bundle(); 
      YourFragment fragment = new YourFragment(); 
      bundle.putInt("year", myDate.year); 
      bundle.putInt("month", myDate.month); 
      bundle.putInt("day", myDate.day); 
      fragment.setArguments(bundle); 
      return fragment; 
     } 
    } 

Все это, решите свой вопрос?

2

Я лично протестировал его, и он работает. Надеюсь, это поможет!

MainActivity.java

public class MainActivity extends ActionBarActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    public class TimePickerFragment extends DialogFragment implements 
      TimePickerDialog.OnTimeSetListener 
      { 

     @Override 
     public Dialog onCreateDialog(Bundle savedInstanceState) 
     { 
      // Use the current time as the default values for the picker 
      final Calendar c = Calendar.getInstance(); 
      int hour = c.get(Calendar.HOUR_OF_DAY); 
      int minute = c.get(Calendar.MINUTE); 

      // Create a new instance of TimePickerDialog and return it 
      return new TimePickerDialog(getActivity(), this, hour, minute, 
        DateFormat.is24HourFormat(getActivity())); 
     } 

     public void onTimeSet(TimePicker view, int hourOfDay, int minute) 
     { 
      // Do something with the time chosen by the user 
      // Toast.makeText(MainActivity.this,String.valueOf(year) + "-" + 
      // String.valueOf(monthOfYear) + "-" + 
      // String.valueOf(dayOfMonth),Toast.LENGTH_LONG).show(); 
      String am_pm = ""; 
      Calendar datetime = Calendar.getInstance(); 
      datetime.set(Calendar.HOUR_OF_DAY, hourOfDay); 
      datetime.set(Calendar.MINUTE, minute); 

      if (datetime.get(Calendar.AM_PM) == Calendar.AM) 
       am_pm = "AM"; 
      else if (datetime.get(Calendar.AM_PM) == Calendar.PM) 
       am_pm = "PM"; 

      String strHrsToShow = (datetime.get(Calendar.HOUR) == 0) ? "12" 
        : datetime.get(Calendar.HOUR) + ""; 

      /* 
      * ((Button) getActivity().findViewById(R.id.btnEventStartTime)) 
      * .setText(strHrsToShow + ":" + datetime.get(Calendar.MINUTE) + " " 
      * + am_pm); 
      */ 

      /* 
      * Toast.makeText(MainActivity.this, "The selected time is: " + 
      * String.valueOf(hourOfDay) + ":" + String.valueOf(minute) + " " + 
      * am_pm, Toast.LENGTH_SHORT).show(); 
      */ 

      // This code converts 24 hour hand to 12 hour hand 
      Toast.makeText(
        MainActivity.this, 
        "The selected time is: " + String.valueOf(strHrsToShow) 
          + ":" + String.valueOf(minute) + " " + am_pm, 
        Toast.LENGTH_SHORT).show(); 
     } 
    } 

    public void showTimePickerDialog(View v) { 
     DialogFragment newFragment = new TimePickerFragment(); 
     newFragment.show(getFragmentManager(), "timePicker"); 
    } 

    public class DatePickerFragment extends DialogFragment implements 
      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); 
     } 

     public void onDateSet(DatePicker view, int year, int month, int day) { 
      // Do something with the date chosen by the user 
      Toast.makeText(MainActivity.this, "The selected date is: " + 
        String.valueOf(day) + "." + String.valueOf(month) + "." + 
        String.valueOf(year), Toast.LENGTH_SHORT).show(); 
     } 

    } 

    public void showDatePickerDialog(View v) { 
     DialogFragment newFragment = new DatePickerFragment(); 
     newFragment.show(getFragmentManager(), "datePicker"); 
    } 
}  

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#4863A0" 
    tools:context="com.nikhil.pickers.MainActivity" > 

    <Button 
     android:id="@+id/pickTime" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_margin="100dp" 
     android:onClick="showTimePickerDialog" 
     android:text="Pick Time" /> 

    <Button 
     android:id="@+id/pickDate" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/pickTime" 
     android:layout_alignLeft="@id/pickTime" 
     android:onClick="showDatePickerDialog" 
     android:text="Pick Date" /> 

</RelativeLayout> 
1

Вы можете использовать слушателей связать ваш fragments друг с другом. Я взял то, что у вас было, и немного изменил его, добавив слушателя для каждого fragment. Затем я создал делегата , который управляет двумя fragments и объединяет результаты аккуратно в один объект Calendar. Вы можете получить результат, как хотите. Возможно, с другим слушателем.

УКАЗАНИЕ что это не лучшее решение, архитектурно говорящее, поскольку я выбросил его в течение нескольких минут. Вы можете перемещать вещи вокруг, чтобы получить шаблон, который наилучшим образом соответствует сценарию.

Вот пример кода.


Вы можете вызвать диалог с вашей Activity как этот

private void showDateTimeDialog() { 
    final FragmentManager fm = getSupportFragmentManager(); 
    DateTimeDialog dateTimeDialog = new DateTimeDialog(this, fm); 
    dateTimeDialog.show(); 
} 

DateTimeDialog.Java

import android.app.Activity; 
import android.support.v4.app.FragmentManager; 
import android.widget.Toast; 

import java.util.Calendar; 

public class DateTimeDialog { 

    private Activity activity; 
    private DatePickerFragment datePickerFragment; 
    private TimePickerFragment timePickerFragment; 
    private FragmentManager fragmentManager; 
    private Calendar calendar; 

    public DateTimeDialog(Activity activity, FragmentManager fragmentManager) { 
     this.activity = activity; 
     this.fragmentManager = fragmentManager; 

     this.calendar = Calendar.getInstance(); 
     this.datePickerFragment = new DatePickerFragment(); 
     this.timePickerFragment = new TimePickerFragment(); 

     this.datePickerFragment.setOnDateSelectedListener(getOnDateSelectedListener()); 
     this.timePickerFragment.setOnTimeSelectedListener(getOnTimeSelectedListener()); 
    } 

    public void show() { 
     datePickerFragment.show(fragmentManager, "datePickerFragment"); 
    } 

    private TimePickerFragment.OnTimeSelectedListener getOnTimeSelectedListener() { 
     return new TimePickerFragment.OnTimeSelectedListener() { 

      @Override 
      public void onTimeSelected(int hourOfDay, int minute) { 
       calendar.set(Calendar.HOUR_OF_DAY, hourOfDay); 
       calendar.set(Calendar.MINUTE, minute); 

       // Here you have your finished result. 
       Toast.makeText(activity, calendar.getTime().toString(), Toast.LENGTH_LONG).show(); 
      } 
     }; 
    } 

    private DatePickerFragment.OnDateSelectedListener getOnDateSelectedListener() { 
     return new DatePickerFragment.OnDateSelectedListener() { 

      @Override 
      public void onDateSelected(int year, int monthOfYear, int dayOfMonth) { 
       calendar.set(Calendar.YEAR, year); 
       calendar.set(Calendar.MONTH, monthOfYear); 
       calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); 

       timePickerFragment.show(fragmentManager, "timePickerFragment"); 
      } 
     }; 
    } 
} 

DatePickerFragment.java

import android.app.DatePickerDialog; 
import android.app.Dialog; 
import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 
import android.widget.DatePicker; 

import java.util.Calendar; 

public class DatePickerFragment 
     extends DialogFragment implements DatePickerDialog.OnDateSetListener { 

    private OnDateSelectedListener onDateSelectedListener; 

    public void setOnDateSelectedListener(OnDateSelectedListener onDateSelectedListener) { 
     this.onDateSelectedListener = onDateSelectedListener; 
    } 

    @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) { 
     onDateSelectedListener.onDateSelected(year, monthOfYear, dayOfMonth); 
    } 

    public interface OnDateSelectedListener { 
     void onDateSelected(int year, int monthOfYear, int dayOfMonth); 
    } 
} 

TimePickerFragment.java

import android.app.Dialog; 
import android.app.TimePickerDialog; 
import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 
import android.text.format.DateFormat; 
import android.widget.TimePicker; 

import java.util.Calendar; 

public class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener { 

    private OnTimeSelectedListener onTimeSelectedListener; 

    public void setOnTimeSelectedListener(OnTimeSelectedListener onTimeSelectedListener) { 
     this.onTimeSelectedListener = onTimeSelectedListener; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     final Calendar c=Calendar.getInstance(); 
     int hour=c.get(Calendar.HOUR_OF_DAY); 
     int minute=c.get(Calendar.MINUTE); 
     return new TimePickerDialog(getActivity(),this,hour,minute, DateFormat.is24HourFormat(getActivity())); 
    } 

    @Override 
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 
     onTimeSelectedListener.onTimeSelected(hourOfDay, minute); 
    } 

    public interface OnTimeSelectedListener { 
     void onTimeSelected(int hourOfDay, int minute); 
    } 
} 
Смежные вопросы