Диалоговое окно Datepicker без визуализации календаря в режиме lollipop [spinner mode]?
Я прочитал документацию: http://developer.android.com/guide/topics/ui/controls/pickers.html
но теперь в леденец появляется календарь (это нормально для события, но ужасно для установки даты рождения, я бы использовал режим spinner), и я не могу его удалить!
В макете Это легко с этим свойством:
<DatePicker
datePickerMode="spinner"...>
но из кода DatePickerDialog, если я пытаюсь установить
dialogDatePicker.getDatePicker().setSpinnersShown(true);
dialogDatePicker.getDatePicker().setCalendarViewShown(false);
Эти свойства не работают, и календарь продолжает появляться!
public static class MyDatePicker extends DialogFragment implements DatePickerDialog.OnDateSetListener {
int pYear;
int pDay;
int pMonth;
@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);
DatePickerDialog dialogDatePicker = new DatePickerDialog(getActivity(), this, year, month, day);
dialogDatePicker.getDatePicker().setSpinnersShown(true);
dialogDatePicker.getDatePicker().setCalendarViewShown(false);
return dialogDatePicker;
// Create a new instance of DatePickerDialog and return it
//return new DatePickerDialog(getActivity(), this, year, month, day);
}
public void onDateSet(DatePicker view, int year, int month, int day) {
pYear = year;
pDay = day;
pMonth = month;
}
}
Ответы
Ответ 1
DatePickerDialog использует тему диалога, указанную в вашей теме активности. Это полностью заданная тема, а это означает, что вам нужно повторно указать любые атрибуты, такие как стиль выбора даты, которые вы указали в своей теме активности.
<style name="MyAppTheme" parent="android:Theme.Material">
<item name="android:dialogTheme">@style/MyDialogTheme</item>
<item name="android:datePickerStyle">@style/MyDatePicker</item>
</style>
<style name="MyDialogTheme" parent="android:Theme.Material.Dialog">
<item name="android:datePickerStyle">@style/MyDatePicker</item>
</style>
<style name="MyDatePicker" parent="android:Widget.Material.DatePicker">
<item name="android:datePickerMode">spinner</item>
</style>
Примечание: Из-за Issue 222208 это не будет работать в Android N/API 24. Он уже исправлен на платформе для следующего выпуска. Для устройств API 24 не существует обходного пути.
Ответ 2
Примените Holo_theme на уровне кода, который работал у меня.
new DatePickerDialog(getActivity(),android.R.style.Theme_Holo_Dialog,this, year,month, day);
Ответ 3
Добавьте атрибут calendarViewShown и установите для него значение false:
<DatePicker
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/date_field"
android:calendarViewShown="false"/>
Ответ 4
Я думаю, что лучшим решением этой проблемы является определение нового стиля в файле XML, а затем его программное использование в коде.
Несмотря на то, что @alanv answer идеально подходит и будет работать правильно, проблема заключается в том, что он будет применяться ко всем сборщикам даты. Предположим, у вас есть один DatePicker, где вам нужно показать представление календаря, а еще один DatePicker, где вам нужно показать представление Spinner, это не сработает.
Итак, определите новый стиль в файле styles.xml. Создайте этот файл в папке с именем values-v21 (см. Структуру имен здесь), поскольку эти атрибуты вводятся только после леденца. Перед леденец был только режим spinner.
<style name="CustomDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
<item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>
<style name="MyDatePickerStyle" parent="@android:style/Widget.Material.DatePicker">
<item name="android:datePickerMode">spinner</item>
</style>
И, наконец, используйте его в коде, подобном этому
DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(),
R.style.CustomDatePickerDialogTheme, this, year, month, day);
return datePickerDialog;
Ответ 5
Можете ли вы попробовать это
DatePickerDialog dialogDatePicker = new DatePickerDialog(getActivity(), this, year, month, day);
dialogDatePicker.getDatePicker().setCalendarViewShown(false);
return dialogDatePicker;
удаление
dialogDatePicker.getDatePicker().setSpinnersShown(true);
Ответ 6
Все фантазии в стороне, используйте конструктор DatePickerDialog, который принимает параметр "int theme".
Без него он, по-видимому, по умолчанию не зависит от того, какой int устанавливает его в режим CalendarView.
С небольшими целыми числами (0, 1, 2, 3...) он даст вам счетчик (по крайней мере, в моем приложении API 19, запущенном на эмуляторе).
В принципе, попробуйте
новый DatePickerDialog (getContext(), 0, это, год, месяц, день)
Обратите внимание на 0 (или 1, или 2 и т.д.) Там
Внимание:
Я не уверен, есть ли список где-то из статических полей темы и с использованием жесткого кода "0" вместо "Theme.HOLO_LIGHT" или что-то другое, что может повлиять на разные устройства, но оно каким-то образом выполняется.
Ответ 7
Попробуй, это сработало для меня, сделай пользовательский datelistener:
@SuppressWarnings("deprecation")
public void setDate(View view) {
showDialog(999);
}
@SuppressWarnings("deprecation")
protected Dialog onCreateDialog(int id) {
// TODO Auto-generated method stub
if (id == 999) {
return new DatePickerDialog(this, myDateListener, year, month-1, day);
}
return null;
}
//THIS
private DatePickerDialog.OnDateSetListener myDateListener= new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker arg0, int arg1, int arg2, int arg3) {
showDate(arg1, arg2+1, arg3);
}
};
private void showDate(int year, int month, int day) {
//dateView.setText(new StringBuilder().append(day).append("-")
// .append(month).append("-").append(year));
}
Ответ 8
Вы можете использовать библиотеку для создания старого "прядильного" стиля DatePicker, который состоит всего из трех NumberPicker:
https://github.com/drawers/SpinnerDatePicker
![сборщик дат]()
Сначала определите стиль:
<style name="NumbePickerStyle">
<item name="android:textSize">22dp</item>
<item name="android:textColorPrimary">@color/colorAccent</item>
<item name="android:colorControlNormal" tools:targetApi="lollipop">@color/colorAccent</item>
</style>
Тогда
new SpinnerDatePickerDialogBuilder()
.context(MainActivity.this)
.callback(MainActivity.this)
.spinnerTheme(spinnerTheme)
.year(year)
.monthOfYear(monthOfYear)
.dayOfMonth(dayOfMonth)
.build()
.show();
Отказ от ответственности: я являюсь автором этой библиотеки
Ответ 9
Методы DatePicker, связанные с отображением отображения счетчика и/или календаря, устарели от уровня API 24. Метод setSpinnersShown (показанный логический) и setCalendarViewShown (показанные булевыми) устарели, поскольку стиль материала в режиме календаря не поддерживает эту функцию.
Если вы хотите использовать стиль материала в режиме spinner, используйте виджет DatePicker.
Примените стиль ниже к элементу xml для выбора даты, чтобы получить материал. Для получения дополнительной информации о выборе даты и стилях см. http://www.zoftino.com/android-datepicker-example.
<style name="MyDatePickerSpinnerStyle" parent="@android:style/Widget.Material.DatePicker">
<item name="android:datePickerMode">spinner</item>
<item name="android:calendarViewShown">false</item>
<item name="colorControlNormal">#d50000</item>
</style>