Хорошая практика для установки дат из DatePickerDialog? - PullRequest
0 голосов
/ 09 июля 2019

В настоящее время я занимаюсь разработкой приложения, и в этом приложении вам нужно иметь возможность выбирать даты.Я решил это, показав DatePickerDialog и применив значения к EditText.Мой коллега сказал мне, что я не должен создавать новый объект в функции, а объявлять его как переменную.

final Calendar c = Calendar.getInstance();
int mYear = c.get(Calendar.YEAR);
int mMonth = c.get(Calendar.MONTH);
int mDay = c.get(Calendar.DAY_OF_MONTH);

DatePickerDialog datePickerDialog = new DatePickerDialog(this,
    new DatePickerDialog.OnDateSetListener() {

        @Override
        public void onDateSet(DatePicker view, int year,
            int monthOfYear, int dayOfMonth) {

                startDate.setText(year + "-" +(monthOfYear + 1) + "-" + dayOfMonth);
        }
    }, mYear, mMonth, mDay);

//datePickerDialog.onDateChanged();
datePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis());
datePickerDialog.show();

Это хорошая практика или есть лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Я предлагаю

  1. Используйте LocalDate из java.time, современного Java-API даты и времени, вместо Calendar. Calendar плохо спроектирован и давно устарел.
  2. Используйте форматтер для форматирования текста даты для отображения. В частности, используйте встроенный локализованный формат, чтобы порадовать пользователя в некоторой локали.

Итак, ваш фрагмент становится примерно таким:

    LocalDate today = LocalDate.now(ZoneId.systemDefault());
    int mYear = today.getYear();
    Month mMonth = today.getMonth();
    int mDay = today.getDayOfMonth();

    DatePickerDialog datePickerDialog = new DatePickerDialog(this,
        new DatePickerDialog.OnDateSetListener() {

            @Override
            public void onDateSet(DatePicker view, int year,
                    int monthOfYear, int dayOfMonth) {
                DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);
                LocalDate date = LocalDate.of(mYear, monthOfYear + 1, dayOfMonth);
                startDate.setText(date.format(dateFormatter));
            }
        }, mYear, mMonth.getValue() - 1, mDay);

Вопрос: Могу ли я использовать LocalDate и Month на Android?

Да, классы из java.time прекрасно работают на старых и новых устройствах Android. Они просто требуют как минимум Java 6 .

  • В Java 8 и более поздних версиях, а также на новых устройствах Android (начиная с уровня API 26) встроен современный API.
  • В Java 6 и 7 получите ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).
  • На более старых (Android) версиях Android используется ThreeTen Backport. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

0 голосов
/ 09 июля 2019

Попытайтесь сделать это, мы можем создать собственный метод выбора даты для этого метода:

public class TimePickerDialogCustom extends Dialog implements View.OnClickListener {

public Activity c;
public Dialog d;
public RelativeLayout close;
TextView time;
private Button ok;
private TimePicker timePicker;
int status;
AlexPoppinsLightTextView error_msg_txtView;


public TimePickerDialogCustom(FragmentActivity a, TextView time, int status) {
    super(a);
    this.c = a;
    this.time = time;
    this.status = status;

}


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.pick_time_layout);
    close = findViewById(R.id.closepopup);
    ok = findViewById(R.id.btn_ok_time);
    timePicker = findViewById(R.id.tp_for_activity);

    AppGlobalValidation.hideKeyboard(getContext());


    if (status == 1) {
        SimpleDateFormat displayFormat = new SimpleDateFormat("HH:mm");
        SimpleDateFormat parseFormat = new SimpleDateFormat("hh:mm a");
        try {
            Date date = parseFormat.parse(time.getText().toString());
         String time = displayFormat.format(date);            //which is from server;
            String splitTime[] = time.split(":");
            int hours = Integer.parseInt(splitTime[0]);
            int minutes = Integer.parseInt(splitTime[1]);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                timePicker.setHour(hours);
                timePicker.setMinute(minutes);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
    } else if (status == 2) {

        SimpleDateFormat displayFormat = new SimpleDateFormat("HH:mm");
        SimpleDateFormat parseFormat = new SimpleDateFormat("hh:mm a");
        try {
            Date date = parseFormat.parse(time.getText().toString());
            String time = displayFormat.format(date);    //which is from server;
            String splitTime[] = time.split(":");
            int hours = Integer.parseInt(splitTime[0]);
            int minutes = Integer.parseInt(splitTime[1]);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                timePicker.setHour(hours);
                timePicker.setMinute(minutes);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
    } 


    error_msg_txtView = findViewById(R.id.error_msg_txtView);
    close.setOnClickListener(this);


    ok.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (status == 1) {
                int hour = timePicker.getCurrentHour();
                int minute = timePicker.getCurrentMinute();

                if (hour >= 0 && hour < 12) {
                    error_msg_txtView.setVisibility(View.GONE);
    time.setText(AppGlobalValidation.convertTo12Hour("" + hour + ":" + "" + minute));
                    AppGlobalValidation.hideKeyboard(getContext());
                    dismiss();

                } else {
                    error_msg_txtView.setVisibility(View.VISIBLE);
                    error_msg_txtView.setText("Please Select Morning");

                }

            } else if (status == 2) {

                int hour = timePicker.getCurrentHour();
                int minute = timePicker.getCurrentMinute();

                if (hour >= 12 && hour < 18) {
                    error_msg_txtView.setVisibility(View.GONE);
    time.setText(AppGlobalValidation.convertTo12Hour("" + hour + ":" + "" + minute));
                    dismiss();
                    AppGlobalValidation.hideKeyboard(getContext());

                } else {
                    error_msg_txtView.setVisibility(View.VISIBLE);
                    error_msg_txtView.setText("Please Select Afternoon ");

                }

            } 
}

@Override
public void onClick(View view) {
    dismiss();
    AppGlobalValidation.hideKeyboard(getContext());
}
 }

После создания этих методов для вызова этих методов в вашей деятельности или фрагменте:

при прослушивании щелчка для вызоваэто методы:

    TimePickerDialogCustom timePickerDialogCustom = new 
    TimePickerDialogCustom(getActivity(), morning_time_txtView, 1);
            timePickerDialogCustom.show();
            timePickerDialogCustom.setCancelable(false);
            timePickerDialogCustom.setCanceledOnTouchOutside(true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...