2 Указателя даты как блесны в Android

#android #datepicker #spinner

#Android #средство выбора даты #счетчик

Вопрос:

у меня возникли некоторые проблемы с моими 2 датами как блеснами в Android. Первый — это дата регистрации, а второй — дата выезда. Я хочу, чтобы моя дата оформления заказа автоматически переходила на следующий день, когда я выбираю контрольную, и наоборот, когда я выбираю дату оформления заказа, дата проверки автоматически переходит на предыдущий день. Я много перепробовал, но не нашел способа для этой настройки. Я всегда заканчивал бесконечный цикл, потому что это вызвало это, и это вызвало это, и мое приложение разбилось. У вас, ребята, есть какое-либо решение для этого? Спасибо за любую помощь.

Ответ №1:

Решение

activity_main.xml

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <DatePicker
            android:id="@ id/checkInDatePicker"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="20dp"
            android:layout_marginBottom="20dp"
            android:calendarViewShown="false"
            android:datePickerMode="spinner" />

        <TextView
            android:id="@ id/checkInDayOfWeek"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <DatePicker
            android:id="@ id/checkOutDatePicker"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="20dp"
            android:calendarViewShown="false"
            android:datePickerMode="spinner" />

        <TextView
            android:id="@ id/checkOutDayOfWeek"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>
</LinearLayout>
 

MainActivity.java

 public class MainActivity extends AppCompatActivity implements DatePicker.OnDateChangedListener {

    private DatePicker checkInDatePicker;
    private DatePicker checkOutDatePicker;
    private TextView checkInDayOfWeekTextView;
    private TextView checkOutDayOfWeekTextView;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        checkInDatePicker = findViewById(R.id.checkInDatePicker);
        checkOutDatePicker = findViewById(R.id.checkOutDatePicker);
        checkInDayOfWeekTextView = findViewById(R.id.checkInDayOfWeek);
        checkOutDayOfWeekTextView = findViewById(R.id.checkOutDayOfWeek);

        Calendar now = Calendar.getInstance();
        int year = now.get(Calendar.YEAR);
        int month = now.get(Calendar.MONTH);
        int dayOfMonth = now.get(Calendar.DAY_OF_MONTH);
        checkInDatePicker.init(year, month, dayOfMonth, this);
        checkInDayOfWeekTextView.setText(getDayOfWeek(now));
        checkOutDatePicker.init(year, month, dayOfMonth, this);
        checkOutDayOfWeekTextView.setText(getDayOfWeek(now));
    }

    @Override
    public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        if (view.getId() == checkInDatePicker.getId()) {
            // Update check in day of week.
            Calendar checkInDay = Calendar.getInstance();
            checkInDay.set(year, monthOfYear, dayOfMonth);
            String checkInDayOfWeek = getDayOfWeek(checkInDay);
            checkInDayOfWeekTextView.setText(checkInDayOfWeek);

            // Update check out DatePicker
            checkOutDatePicker.init(year, monthOfYear, dayOfMonth, null);
            Calendar nextDay = getNextDay(year, monthOfYear, dayOfMonth);
            checkOutDatePicker.init(nextDay.get(Calendar.YEAR),
                    nextDay.get(Calendar.MONTH),
                    nextDay.get(Calendar.DAY_OF_MONTH),
                    this);

            // Update check out day of week.
            String checkOutDayOfWeek = getDayOfWeek(nextDay);
            checkOutDayOfWeekTextView.setText(checkOutDayOfWeek);
        } else {
            // Update check out day of week.
            Calendar checkOutDay = Calendar.getInstance();
            checkOutDay.set(year, monthOfYear, dayOfMonth);
            String checkOutDayOfWeek = getDayOfWeek(checkOutDay);
            checkOutDayOfWeekTextView.setText(checkOutDayOfWeek);

            // Update check in DatePicker
            checkInDatePicker.init(year, monthOfYear, dayOfMonth, null);
            Calendar prevDay = getPreviousDay(year, monthOfYear, dayOfMonth);
            checkInDatePicker.init(
                    prevDay.get(Calendar.YEAR),
                    prevDay.get(Calendar.MONTH),
                    prevDay.get(Calendar.DAY_OF_MONTH),
                    this);

            // Update check in day of week.
            String checkInDayOfWeek = getDayOfWeek(prevDay);
            checkInDayOfWeekTextView.setText(checkInDayOfWeek);
        }
    }

    private Calendar getNextDay(int year, int monthOfYear, int dayOfMonth) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, monthOfYear, dayOfMonth);
        calendar.add(Calendar.DAY_OF_MONTH, 1);
        return calendar;
    }

    private Calendar getPreviousDay(int year, int monthOfYear, int dayOfMonth) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, monthOfYear, dayOfMonth);
        calendar.add(Calendar.DAY_OF_MONTH, -1);
        return calendar;
    }

    private String getDayOfWeek(Calendar calendar) {
        String dayOfWeek = "";

        switch (calendar.get(Calendar.DAY_OF_WEEK)) {
            case Calendar.SUNDAY:
                dayOfWeek = "Sunday";
                break;
            case Calendar.MONDAY:
                dayOfWeek = "Monday";
                break;
            case Calendar.TUESDAY:
                dayOfWeek = "Tuesday";
                break;
            case Calendar.WEDNESDAY:
                dayOfWeek = "Wednesday";
                break;
            case Calendar.THURSDAY:
                dayOfWeek = "Thursday";
                break;
            case Calendar.FRIDAY:
                dayOfWeek = "Friday";
                break;
            case Calendar.SATURDAY:
                dayOfWeek = "Saturday";
                break;
        }

        return dayOfWeek;
    }
}
 

Комментарии:

1. Спасибо. Это работает просто отлично, но ваш метод, такой как setOnDateChangedListener, нацелен на API 26 и выше. Есть ли у вас какой-либо возможный способ работы с более низким API и что мне делать, если я хочу добавить день недели рядом с моим сборщиком. Просто текст, который отображает день недели, не нужно выбирать, как средство выбора.

2. @sai Рад слышать, что, если этот ответ решил вашу проблему, пожалуйста, примите его в качестве ответа, это поможет мне улучшить мой ответ в будущем. Счастливого кодирования 🙂