Я хочу знать, есть ли способ создать datePicker во фрагменте? Я создаю одно регулярное действие, и это дает мне синтаксическую ошибку. Каков правильный способ сделать это?
Как создать диалоги datePicker и timePicker в классе фрагментов?
Ответ 1
Вам, скорее всего, понадобится использовать 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(" "));
}
Ответ 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);
}