Как создать диалоги datePicker и timePicker в классе фрагмента?
Я хочу знать, есть ли способ создать DatePicker во фрагменте? Я создаю один, который может выполнять обычное действие, и это дает мне синтаксическую ошибку. Как правильно это сделать?
5 ответов
Скорее всего, вам потребуется использовать DialogFragment. Я нашел некоторую информацию здесь:
а также большую помощь здесь:
Это должно помочь вам встать на вашем пути, я делаю то же самое сейчас. Хотя в примере кода я не использую конструктор, а просто возвращаю:
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(" "));
}
Расширяя ответ 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");
Не уверен, что это лучший способ сделать это, но, похоже, работает нормально.
Хотя приведенные выше ответы могут сработать, я считаю, что у меня гораздо более простое решение:
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
}
};
Предыдущие anwsers объясняют достаточно хорошо, но вот как я изменил представление 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");
}
Установите этот метод onClick метод 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>
Вот фрагмент, в котором хотелось бы использовать указатель даты во фрагменте:
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);
}