如何在DatePicker中关闭CalendarView?

Jam*_*mes 44 android android-layout

在我的设置屏幕上,我有一个日期选择器小部件.在Eclipse中的设计器中,它显示为我想要的(DMY的3个微调器),但是当我在我的设备上进行测试时,我得到一个相当奇怪的视图,左边有一个侧面旋转器,右边是一个日历.从来没有见过这个(!),但做了一些研究,我想我正在看"CalendarView".

我发现我应该能够将"calendarViewShown"属性设置为false-但是我的XML会引发错误.我在这里发现另一个问题,建议API级别是责备(我的minSDKLevel是7,但我的目标是11,所以我可以得到操作栏按钮而不是oldskool菜单).所以我想我会尝试在代码中设置它:

    int currentapiVersion = android.os.Build.VERSION.SDK_INT;
    if (currentapiVersion >= 11)
        minDateSelector.setCalendarViewShown = false;
Run Code Online (Sandbox Code Playgroud)

但是,再次找不到这个失败的setCalendarViewShown.但是这里的文档说它应该存在.有任何想法吗?!

小智 96

如果您的目标是更高版本的API,则可以在以下版本中使用以下XML(无需编写Java代码)<DatePicker>:

 android:calendarViewShown="false"
Run Code Online (Sandbox Code Playgroud)


tor*_*ech 32

DatePicker中的方法

    public void setCalendarViewShown (boolean shown)
Run Code Online (Sandbox Code Playgroud)

存在从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
}
Run Code Online (Sandbox Code Playgroud)

  • 您应该始终定位最新的SDK; 这是避免需要使用反射. (3认同)

Sca*_*a09 14

我使用以下XML配置:

android:datePickerMode="spinner"
android:calendarViewShown="false"
Run Code Online (Sandbox Code Playgroud)

只有以下配置对我不起作用:

android:calendarViewShown="false"
Run Code Online (Sandbox Code Playgroud)


mar*_*rco 10

在那些情况下我使用

import android.os.Build;

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

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        minDateSelector.setCalendarViewShown(false);
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为可读性比使用反射更好,样式比catch更好,忽略异常.当然,反思也是有效的.


小智 5

我遇到了和你一样的问题,我无法通过XML显示更改.

您走在正确的轨道上,尝试将最后一行更改为:

minDateSelector.setCalendarViewShown(false);
Run Code Online (Sandbox Code Playgroud)