Подтвердить что ты не робот

Как создать диалоги datePicker и timePicker в классе фрагментов?

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

4b9b3361

Ответ 1

Вам, скорее всего, понадобится использовать DialogFragment. Я нашел здесь следующую информацию:

Показать диалог из фрагмента?

а также большую помощь здесь:

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

Это должно помочь вам встать на пути, я делаю это сейчас. Хотя внутри кода примера я не использую построитель и вместо этого просто возвращаю:

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

Кажется, что это работает... хотя я еще не могу понять, как обновить текст на фрагменте, который вызывает этот DialogFragment. Я думал, что это сработает, и это не так:

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

 }

Ответ 2

Расширение ответа Codejoy:

Вот мой класс DatePickerDialogFragment:

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

(Обратите внимание, что конструктор принимает фрагмент, который использует это диалоговое окно, и мы используем эту ссылку для поля прослушивания обратного вызова для DatePickerDialog)

Мой фрагмент затем просто реализует onDateSetListener:

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

... и затем я показываю диалог из моего фрагмента следующим образом:

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

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

Ответ 3

Хотя выше ответы могут работать, я считаю, что у меня гораздо более простое решение:

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

Где datePickerListerener выглядит примерно так:

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

Ответ 4

Предыдущие помощники объясняют достаточно хорошо, но вот как я изменил метод onDateSet вида DialogFragment.

Вы можете передать представление, которое хотите изменить, на конструктор класса, расширяющий DialogFragment. Затем вызовите метод setText метода onDateSet класса. Вот код:

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

Затем вы можете показать свой фрагмент следующим образом:

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

Установите этот метод в методе ClickClick EditText, который вы хотите изменить. Вот так:

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

Ответ 5

Вот фрагмент, который хотел бы использовать datepicker в фрагменте:

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

и в вашем фрагменте:

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