Как отключить CalendarView в DatePicker? - PullRequest
44 голосов
/ 27 февраля 2012

На моем экране настроек у меня есть виджет выбора даты. В конструкторе в Eclipse он отображается так, как я хочу (3 счетчика для D-M-Y), но когда я тестирую на своем устройстве, я получаю довольно странный вид с боковым счетчиком слева и календарем справа. Никогда не видел этого раньше (!), Но проводя некоторые исследования, я думаю, что вижу «CalendarView».

Я обнаружил, что должен иметь возможность установить для свойства calendarViewShown значение false, но мой XML выдает ошибку с этим. Здесь я обнаружил еще один вопрос, который предполагал, что виноват уровень API (мой minSDKLevel равен 7, но я нацеливаюсь на 11, поэтому я могу получить кнопку панели действий, а не меню oldskool). Поэтому я решил попробовать установить его в коде:

    int currentapiVersion = android.os.Build.VERSION.SDK_INT;
    if (currentapiVersion >= 11)
        minDateSelector.setCalendarViewShown = false;

Но, опять же, это не удалось - setCalendarViewShown не найден. Но документы здесь говорят, что оно должно существовать. Есть идеи?!

Ответы [ 5 ]

96 голосов
/ 02 июля 2013

Если вы ориентируетесь на более позднюю версию API, вы можете использовать следующий XML (не нужно писать код Java) в вашем <DatePicker>:

 android:calendarViewShown="false"
32 голосов
/ 20 июня 2012

Метод в DatePicker

    public void setCalendarViewShown (boolean shown)

существует, начиная с API 11. Если вы minSdkLevel = 7, компилятор не распознает его как допустимый метод - метод не существует на Android 2.3 или 2.2.Лучший способ решить эту проблему - использовать отражение.Примерно так должно работать правильно:

int currentapiVersion = android.os.Build.VERSION.SDK_INT;
if (currentapiVersion >= 11) {
  try {
    Method m = minDateSelector.getClass().getMethod("setCalendarViewShown", boolean.class);
    m.invoke(minDateSelector, false);
  }
  catch (Exception e) {} // eat exception in our case
}
14 голосов
/ 29 апреля 2016

Я заставил его работать со следующей конфигурацией XML:

android:datePickerMode="spinner"
android:calendarViewShown="false"

У меня не работала только следующая конфигурация:

android:calendarViewShown="false"
10 голосов
/ 24 февраля 2013

В этих случаях я использую

import android.os.Build;

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void someThing() {
    [...]

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        minDateSelector.setCalendarViewShown(false);
    }
}

Я думаю, что удобочитаемость лучше, чем использование отражения, а стиль лучше, чем перехват и игнорирование исключений. Конечно, отражение также работает.

5 голосов
/ 30 марта 2012

У меня была такая же проблема, как и у вас, я не смог отобразить изменение через XML.

Вы на правильном пути, попробуйте изменить последнюю строку на:

minDateSelector.setCalendarViewShown(false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...