#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 Рад слышать, что, если этот ответ решил вашу проблему, пожалуйста, примите его в качестве ответа, это поможет мне улучшить мой ответ в будущем. Счастливого кодирования 🙂