【问题标题】:Hide Year field in Android DatePicker?在 Android DatePicker 中隐藏年份字段?
【发布时间】:2012-05-11 05:29:34
【问题描述】:

我正在使用基本的 DatePicker,我正在尝试弄清楚如何隐藏 DatePickerDialog 上的 Year 字段,以便仅显示月份和日期。我不介意当年的底层代码仍然存在,我只想在对话框中隐藏年份字段。你知道这样的:

((View) myYear).setVisibility(View.GONE);

我知道这是行不通的,因为 myYear 是一个 int 而不是 View,而是类似的东西。有可能吗?

【问题讨论】:

标签: android datepicker


【解决方案1】:

我发现实现 DatePicker 的一个超级简单的方法是在 xml 中调用它:

    <DatePicker
    android:id="@+id/thePicker"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

然后在java中隐藏你想要的任何字段(在这种情况下是年份):

    picker = (DatePicker) findViewById(R.id.thePicker);
    try {
        Field f[] = picker.getClass().getDeclaredFields();
        for (Field field : f) {
            if (field.getName().equals("mYearPicker")) {
                field.setAccessible(true);
                Object yearPicker = new Object();
                yearPicker = field.get(picker);
                ((View) yearPicker).setVisibility(View.GONE);
            }
        }
    } 
    catch (SecurityException e) {
        Log.d("ERROR", e.getMessage());
    } 
    catch (IllegalArgumentException e) {
        Log.d("ERROR", e.getMessage());
    } 
    catch (IllegalAccessException e) {
        Log.d("ERROR", e.getMessage());
    }

【讨论】:

  • 您可以将 if (field.getName().equals("mYearPicker")) { 替换为 if (field.getName().equals("mYearPicker") || field.getName().equals("mYearSpinner")) { 以解决 Honeycomb 和更高版本 Android 中的 DatePicker 小部件...
  • 对于最新的安卓,也隐藏“mCalendarView”
【解决方案2】:

请务必小心使用此解决方案。您正在使用反射来访问字段并更改可见性。这不适用于 Android 5.0 ! Google 已更改 TimePicker 和 DatePicker 的实现,并且这些类不再公开委托的任何字段。

我还不知道适用于 Android 5.0+ 的解决方案。一旦发现有趣的东西,我会尽快通知您。

作为一个想法,您可以使用 Build.VERSION.SDK_INT 检查 Android 版本,然后尝试使用反射访问 DatePickerSpinnerDelegate 并设置您想要的字段。

同样,这不是理想的解决方案,因为 Google 可以一次又一次地随意更改...

【讨论】:

  • 那么 android 5.0+ 的解决方案是什么?
  • 我从未找到任何好的解决方案。对于我们的项目,我只是简单地将提供的 DatePicker 与年份选择一起使用......你也可以看看这个android-arsenal.com/tag/27。如果您正在寻找可自定义的 DatePicker 库,它可能会很有用。
  • 我按照this创建了一个自定义组件,得到了我想要的。
【解决方案3】:

在日期选择器中禁用年份字段的简单方法

DatePicker dp = findDatePicker((ViewGroup) dialog.getWindow().getDecorView());

if(dp != null) 
{
    ((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0)).getChildAt(2).setEnabled(false);
    ((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0)).getChildAt(2).setAlpha(0.4f);
}

如果您想删除年份字段,只需将结果视图的可见性设置为 View.GONE,如下所示

dp.getChildAt(0)).getChildAt(0)).getChildAt(2).setVisibility(View.GONE)



private DatePicker findDatePicker(ViewGroup group) {
    if (group != null) {
        for (int i = 0, j = group.getChildCount(); i < j; i++) {
            View child = group.getChildAt(i);
            if (child instanceof DatePicker) {
                return (DatePicker) child;
            } else if (child instanceof ViewGroup) {
                DatePicker result = findDatePicker((ViewGroup) child);
                if (result != null)
                    return result;
            }
        }
    }
    return null;

}

我参考了以下链接以供参考 Remove year from DatePickerDialog

【讨论】:

  • 在 Android 7 上崩溃 - 尝试在空对象引用上调用虚拟方法 'void android.view.View.setVisibility(int)'
【解决方案4】:

您可以使用此功能设置年份范围

datePicker.setYearRange(1950,2017);

【讨论】:

  • 这并没有回答“如何隐藏年份字段”的问题,是吗?
【解决方案5】:

最近设法通过将日期选择器宽度设置得太小来隐藏对话框的年份部分。

<DatePicker
        android:id="@+id/month_day_datepicker"
        android:layout_width="140dp"
        android:datePickerMode="spinner"
        style="?android:attr/borderlessButtonStyle"/>

让我知道这是否可行,显然,绑定中有一个可访问的年份,但在计算日期时你不能选择它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 2015-08-27
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多