当前位置: 首页 > 知识库问答 >
问题:

在Android5.0+Lollipop中从DatePicker中隐藏日、月或年

程和畅
2023-03-14

我一直在搜索一个解决方案,以便从DatePicker中隐藏以下任意一个旋转器。对于Android5.0,内部变量被改变了,在我的例子中,日和月旋转器在我的设备更新后再次可见。

Android 4.4和Kitkat解决方案

DatePicker dpDate = (DatePicker) findViewById(R.id.dpDate);

    // Initialize Date Picker
    int year    = dpDate.getYear();
    int month   = dpDate.getMonth();
    int day     = dpDate.getDayOfMonth();
    dpDate.init(year, month, day, this);

Field f[] = dpDate.getClass().getDeclaredFields();
            for (Field field : f) 
            {
                // Hides the DAY spinner
                if(field.getName().equals("mDayPicker") || field.getName().equals("mDaySpinner")) 
                {
                    field.setAccessible(true);
                    Object dayPicker = new Object();
                    dayPicker = field.get(dpDate);
                    ((View) dayPicker).setVisibility(View.GONE);
                }

                // Hides the MONTH spinner
                if(field.getName().equals("mMonthPicker") || field.getName().equals("mMonthSpinner")) 
                {
                    field.setAccessible(true);
                    Object monthPicker = new Object();
                    monthPicker = field.get(dpDate);
                    ((View) monthPicker).setVisibility(View.GONE);
                }

                // Hides the YEAR spinner
                if(field.getName().equals("mYearPicker") || field.getName().equals("mYearSpinner")) 
                {
                    field.setAccessible(true);
                    Object yearPicker = new Object();
                    yearPicker = field.get(dpDate);
                    ((View) myearPicker).setVisibility(View.GONE);
                }
            }
    DatePicker dpDate = (DatePicker) findViewById(R.id.dpDate);

    // Initialize Date Picker
    int year    = dpDate.getYear();
    int month   = dpDate.getMonth();
    int day     = dpDate.getDayOfMonth();
    dpDate.init(year, month, day, this);

    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
            {
                int daySpinnerId = Resources.getSystem().getIdentifier("day", "id", "android");
                if (daySpinnerId != 0) 
                {
                    View daySpinner = dpDate.findViewById(daySpinnerId);
                    if (daySpinner != null) 
                    {
                        daySpinner.setVisibility(View.GONE);
                    }
                }
            }

            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
            {
                int monthSpinnerId = Resources.getSystem().getIdentifier("month", "id", "android");
                if (monthSpinnerId != 0) 
                {
                    View monthSpinner = dpDate.findViewById(monthSpinnerId);
                    if (monthSpinner != null) 
                    {
                        monthSpinner.setVisibility(View.GONE);
                    }
                }
            }

            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
            {
                int yearSpinnerId = Resources.getSystem().getIdentifier("year", "id", "android");
                if (yearSpinnerId != 0) 
                {
                    View yearSpinner = dpDate.findViewById(yearSpinnerId);
                    if (yearSpinner != null) 
                    {
                        yearSpinner.setVisibility(View.GONE);
                    }
                }
            }

我已经测试过了,它工作的很好。事实上,如果您先将Lollipop的解决方案放在下面,然后在代码中,将Kitkat的解决方案放在下面,那么它对两个版本都是兼容的,没有干扰。(确保使用try/catch;)

编辑7.22.2015:我认为很明显,如果一个人正在使用一个DatePicker,它需要初始化。我包含了代码,以显示您需要在运行其余代码之前初始化DatePicker(在这两种情况下),否则您的视图将抛出NullPointerException。这包括抛出null的yearSpinner。另外,您应该至少有一个日期的视图,不要隐藏所有3个,即不要同时隐藏日、月和年。

共有1个答案

方轩昂
2023-03-14

对于懒人来说,这是一个完全集成的代码(任何SDK),它可以帮助我构建一个月度选择器(90%等于@Brandon的建议):

public void initMonthPicker(){
    dp_mes = (DatePicker) findViewById(R.id.dp_mes);

    int year    = dp_mes.getYear();
    int month   = dp_mes.getMonth();
    int day     = dp_mes.getDayOfMonth();

    dp_mes.init(year, month, day, new DatePicker.OnDateChangedListener() {
        @Override
        public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            month_i = monthOfYear + 1;
            Log.e("selected month:", Integer.toString(month_i));
         //Add whatever you need to handle Date changes
        }
    });

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
        int daySpinnerId = Resources.getSystem().getIdentifier("day", "id", "android");
        if (daySpinnerId != 0)
        {
            View daySpinner = dp_mes.findViewById(daySpinnerId);
            if (daySpinner != null)
            {
                daySpinner.setVisibility(View.GONE);
            }
        }

        int monthSpinnerId = Resources.getSystem().getIdentifier("month", "id", "android");
        if (monthSpinnerId != 0)
        {
            View monthSpinner = dp_mes.findViewById(monthSpinnerId);
            if (monthSpinner != null)
            {
                monthSpinner.setVisibility(View.VISIBLE);
            }
        }

        int yearSpinnerId = Resources.getSystem().getIdentifier("year", "id", "android");
        if (yearSpinnerId != 0)
        {
            View yearSpinner = dp_mes.findViewById(yearSpinnerId);
            if (yearSpinner != null)
            {
                yearSpinner.setVisibility(View.GONE);
            }
        }
    } else { //Older SDK versions
        Field f[] = dp_mes.getClass().getDeclaredFields();
        for (Field field : f)
        {
            if(field.getName().equals("mDayPicker") || field.getName().equals("mDaySpinner"))
            {
                field.setAccessible(true);
                Object dayPicker = null;
                try {
                    dayPicker = field.get(dp_mes);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                ((View) dayPicker).setVisibility(View.GONE);
            }

            if(field.getName().equals("mMonthPicker") || field.getName().equals("mMonthSpinner"))
            {
                field.setAccessible(true);
                Object monthPicker = null;
                try {
                    monthPicker = field.get(dp_mes);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                ((View) monthPicker).setVisibility(View.VISIBLE);
            }

            if(field.getName().equals("mYearPicker") || field.getName().equals("mYearSpinner"))
            {
                field.setAccessible(true);
                Object yearPicker = null;
                try {
                    yearPicker = field.get(dp_mes);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                ((View) yearPicker).setVisibility(View.GONE);
            }
        }
    }
}
 类似资料:
  • 我有一个DatePicker,如下所示: 有没有一种不显示日子的方式?(仅限月份和年份) 如果是通过编程,有没有一个简单的例子如何做? 多谢了。

  • 我正在使用一个基本的DatePicker,我试图弄清楚如何隐藏DatePickerDialog上的Year字段,以便只可见月份和日期。我不介意年份的底层代码仍然存在,我只想在对话框中隐藏年份字段。比如: 我知道这是行不通的,因为我的Year是一个int而不是一个视图,而是沿着这些线的东西。有可能吗?

  • 我正在使用第三方JAR,它们在我的Java应用程序的日志文件中添加自己的日志,我不想在我的日志文件中添加那些第三方日志,因为这会使日志文件变得非常笨拙和混乱。 那些原木就像- `

  • 问题内容: 我第一次弄乱React.js,找不到通过click事件在页面上显示或隐藏内容的方法。我没有在页面上加载任何其他库,所以我正在寻找使用React库的本机方法。到目前为止,这就是我所拥有的。当点击事件触发时,我想显示结果div。 问题答案: 大约在2020年做出反应 在回调中,调用状态挂钩的 setter函数以更新状态并重新渲染: JSFiddle 反应约2014年 关键是使用来更新点击处

  • 我有一个布局,其中包含RelativeLayout作为根布局,相对布局在顶部包含ListView,在相对布局的底部包含一个Edittext align。在Lollipop前版本的设备中,每当软键盘打开Edittext时,我就可以看到Edittext。但在Lollipop软键盘中隐藏了编辑文本。我已经在清单文件中设置了android:WindowsOfInputMode=“adjustPan|adj

  • 我正在从命令行用python运行mplfinance。我想隐藏(或不显示)绘图,因为我将绘图另存为一个。jpg。稍后,我将在图像查看器中查看绘图/图形/图像。 问题是,我必须关闭为脚本绘制的每个图像,以便继续定义下一个图。我不想在执行时看到图形,并且必须在脚本循环创建多个图形时关闭每个图像。换句话说就是“火了就忘”。 有没有办法隐藏(或不显示)mplFinance中的情节 谢谢你的帮助。 谢谢,