Android Datepicker Fragment - Как сделать что-то, когда пользователь устанавливает дату?
Я следую учебнику здесь:
http://developer.android.com/guide/topics/ui/controls/pickers.html
У меня есть все, чтобы работать, и появляется датапикер. Тем не менее, я зациклился на том, как действовать, когда пользователь устанавливает дату.
Я вижу, что у них есть этот метод:
public void onDateSet(DatePicker view, int year, int month, int day) {
// Do something with the date chosen by the user
}
Но это ничего не делает, если я помещаю в него какой-либо код.
Я не знаком с Java, поэтому я не уверен, какой дополнительный код необходим для обновления текстового представления с выбранной датой.
Я добавил этот код:
private DatePickerDialog.OnDateSetListener mDateListener =
new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int month, int day) {
updateDate(year, month, day);
}
};
public void updateDate(int year, int month, int day) {
TextView bdate = (TextView)findViewById(R.id.birthDate);
Date chosenDate = new Date(year, month, day);
java.text.DateFormat dateFormat = DateFormat.getDateFormat(getApplicationContext());
bdate.setText(dateFormat.format(chosenDate));
}
Но это ничего не делает.
Я нашел этот почти точный вопрос:
Получить дату с datepicker с помощью диалоговогофрагмента
Однако в этом решении не будет использоваться (EditSessionActivity) ограничение класса DatePickerFragment на работу только с EditSessionActivity?
Ответы
Ответ 1
Вы должны использовать статический factory для передачи аргументов в DialogFragment. Из docs,
"Каждый фрагмент должен иметь пустой конструктор, поэтому он может быть создан при восстановлении его состояния активности. Настоятельно рекомендуется, чтобы подклассы не имели других конструкторов с параметрами, поскольку эти конструкторы не будут вызываться, экземпляр, вместо этого аргументы могут предоставляться вызывающим абонентом с помощью setArguments (Bundle), а затем извлекаются фрагментом с помощью getArguments()."
Аналогично, подкласс Fragment должен быть статическим, чтобы он мог повторно создать экземпляр, не полагаясь на родительскую активность или фрагмент. Если вы не придерживаетесь этих рекомендаций, вы иногда получаете сбои или ошибки, когда ваш фрагмент пытается возобновить работу.
Рекомендуемым способом создания DialogFragment, с Android docs, является использование статического метода factory. Вот пример фрагмента выбора даты, который принимает начальную дату и OnDateChangedListener:
public static class DatePickerFragment extends DialogFragment{
private OnDateSetListener onDateSetListener;
static DatePickerFragment newInstance(Date date, OnDateSetListener onDateSetListener) {
DatePickerFragment pickerFragment = new DatePickerFragment();
pickerFragment.setOnDateSetListener(onDateSetListener);
//Pass the date in a bundle.
Bundle bundle = new Bundle();
bundle.putSerializable(MOVE_IN_DATE_KEY, date);
pickerFragment.setArguments(bundle);
return pickerFragment;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
super.onCreateDialog(savedInstanceState);
Date initialDate = (Date) getArguments().getSerializable(MOVE_IN_DATE_KEY);
int[] yearMonthDay = ymdTripleFor(initialDate);
DatePickerDialog dialog = new DatePickerDialog(getActivity(), onDateSetListener, yearMonthDay[0], yearMonthDay[1],
yearMonthDay[2]);
return dialog;
}
private void setOnDateSetListener(OnDateSetListener listener) {
this.onDateSetListener = listener;
}
private int[] ymdTripleFor(Date date) {
Calendar cal = Calendar.getInstance(Locale.US);
cal.setTime(date);
return new int[]{cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH)};
}
}
Затем вы можете создать один из этих фрагментов диалога следующим образом:
DatePickerFragment.newInstance(yourDate, yourOnDateSetListener);
Ответ 2
Я считаю, что здесь можно использовать DialogFragments:
DialogFragment newFragment = new DatePickerFragment();
newFragment.show(getSupportFragmentManager(), "datePicker");
определить DatePickerFragment и реализовать метод ниже
public void onDateSet(DatePicker view, int year, int month, int day) {
// Do something with the date chosen by the user
DateEdit.setText(day + "/" + (month + 1) + "/" + year);
}
взято из Android DialogFragment Example.
Ответ 3
по моему опыту этот код работает отлично!, я использую win10 Android Studio 2.2...
import android.app.Dialog;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.app.DatePickerDialog;
import android.widget.DatePicker;
import android.widget.EditText;
import java.util.Calendar;
public class MainActivity extends AppCompatActivity implements DatePickerDialog.OnDateSetListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);}
public void datePicker(View view){
DatePickerFragment fragment_date = new DatePickerFragment();
fragment_date.show(getSupportFragmentManager(),"datePicker");}
@Override
public void onDateSet(DatePicker view, int year, int month, int day) {
String day_x = ""+ day ,month_x = ""+(month+1);
if (day < 9 ){ day_x = "0" + day_x;}
if (month < 9 ){ month_x = "0" + month_x;}
((EditText) findViewById(R.id.txtDate)).setText(day_x + "/" + month_x + "/" + year);}
public static class DatePickerFragment extends DialogFragment {
@Override
public Dialog onCreateDialog (Bundle savedInstanceState){
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);
return new DatePickerDialog(getActivity() ,(DatePickerDialog.OnDateSetListener)this,day,month,year);}}
}
У меня есть "textView txtDate" и "кнопка с onclick = datePicker"