Android - 在 datepickerdialog 中隐藏日期字段

Posted

技术标签:

【中文标题】Android - 在 datepickerdialog 中隐藏日期字段【英文标题】:Android - Hide date field in datepickerdialog 【发布时间】:2012-05-27 06:43:22 【问题描述】:

如何在日期选择器对话框中隐藏/删除日期字段。 实际上我的要求是使用本机日期选择器对话框,但它显示为日、月和年。但根据我的要求,我只需要一个月和一年。所以我想从视图中隐藏或删除日期字段。

任何帮助都会非常有用。

【问题讨论】:

【参考方案1】:

我不推荐使用反射来做这种事情。

有一种更简单、更漂亮的方法:

((ViewGroup) datePickerDialog.getDatePicker()).findViewById(Resources.getSystem().getIdentifier("day", "id", "android")).setVisibility(View.GONE);

请注意,DatePickerDialog 中的 .getDatePicker() 方法适用于 API LEVEL >= 11

【讨论】:

这将导致棒棒糖设备出现空指针异常,因为它们使用不同的日期选择器布局。 我也遇到了空指针异常。我使用的是 Android 6.0.1 给我空视图【参考方案2】:
Private DatePickerDialog createDialogWithoutDateField()

    DatePickerDialog dpd = new DatePickerDialog(_activity, ExpiryDateSetListener,cyear,cmonth, cday);
    try
    Field[] datePickerDialogFields = dpd.getClass().getDeclaredFields();
    for (Field datePickerDialogField : datePickerDialogFields)  
        if (datePickerDialogField.getName().equals("mDatePicker")) 
            datePickerDialogField.setAccessible(true);
            DatePicker datePicker = (DatePicker) datePickerDialogField.get(dpd);
            Field datePickerFields[] = datePickerDialogField.getType().getDeclaredFields();
            for (Field datePickerField : datePickerFields) 
               if ("mDayPicker".equals(datePickerField.getName())) 
                  datePickerField.setAccessible(true);
                  Object dayPicker = new Object();
                  dayPicker = datePickerField.get(datePicker);
                  ((View) dayPicker).setVisibility(View.GONE);
               
            
         

      
    catch(Exception ex)
    
  return dpd;


使用上述代码隐藏 DatePickerDialog 中的日期字段。

参考这个LINK

【讨论】:

这是一个卑鄙的建议。最可靠的答案是自己动手。即使您想玩这里建议的脚本小子游戏,也不要使用反射——通过getDatePicker()findViewById() 获取特定的小部件并以这种方式设置它们的可见性。这两种方法都对可能在 Android 操作系统版本或 OEM 固件修改中无效的内部实现做出假设,但至少 findViewById() 方法会做出更少的假设(并且可能运行得更快)。 mDatePicker.getDatePicker().setCalendarViewShown(false); 太棒了。但是“mDayPicker”不起作用。它应该是“mDaySpinner”。【参考方案3】:

DatePickerDatePickerDialog 的源代码可供您克隆、重构到您自己的包中并进行修改以适应。

【讨论】:

【参考方案4】:
((ViewGroup) datePickerDialog.getDatePicker()).findViewById(Resources.getSystem().getIdentifier("day", "id", "android")).setVisibility(View.GONE); 

这可以正常工作

【讨论】:

更多关于代码功能的 cmets 会有所帮助。 在 Android 6.0.1 上,我收到 NullPointerException。【参考方案5】:
    private Calendar mCalendar;
    mCalendar = Calendar.getInstance();// Initialize Calendar

dialog_date_picker.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:background="@drawable/rounded_corners"
android:orientation="vertical"
android:padding="8dp">
<DatePicker
    android:id="@+id/date_picker"
    android:layout_
    android:layout_
    android:layout_weight="4"
    android:calendarViewShown="false"
    android:datePickerMode="spinner" />
<Button
    android:id="@+id/date_time_set"
    android:layout_
    android:layout_
    android:layout_weight="1"
    android:background="@color/colorPrimary"
    android:text="Set"
    android:textColor="@color/colorWhite" /></LinearLayout>

点击时调用的DialogMethod:

private void ExpiryDialog() 
    System.out.println("Inside Dialog Box");
    final Dialog dialog = new Dialog(context);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(R.layout.dialog_date_picker);
    dialog.show();
    final DatePicker datePicker = (DatePicker) dialog.findViewById(R.id.date_picker);
    date_time_set = (Button) dialog.findViewById(R.id.date_time_set);
    datePicker.init(mCalendar.get(Calendar.YEAR), mCalendar.get(Calendar.MONTH), mCalendar.get(Calendar.DAY_OF_MONTH), null);

    LinearLayout ll = (LinearLayout) datePicker.getChildAt(0);
    LinearLayout ll2 = (LinearLayout) ll.getChildAt(0);
    ll2.getChildAt(1).setVisibility(View.INVISIBLE);

    date_time_set.setOnClickListener(new View.OnClickListener()
    
        @Override
        public void onClick(View view)
            dialog.dismiss();
            Integer month = datePicker.getMonth()+1;
            Integer year = datePicker.getYear();
            expMonth = (month.toString().length()   == 1 ? "0"+month.toString():month.toString());
            expYear = year.toString();
            etExpiryDate.setText(expMonth + "/" + expYear);
        
    );

此代码有效并将日期隐藏在 DatePicker 中,因此我可以显示卡片的到期日期。尽情享受吧!

【讨论】:

【参考方案6】:
Calendar c = Calendar.getInstance();
int mYear = c.get(Calendar.YEAR);
int mMonth = c.get(Calendar.MONTH);
int mDay = c.get(Calendar.DAY_OF_MONTH);
DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(), AlertDialog.THEME_HOLO_DARK,
new DatePickerDialog.OnDateSetListener() 

    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) 
        txtMonth.setText(dayOfMonth + "-" + (monthOfYear + 1) + "-" + year);
    

, mYear, mMonth, mDay);
((ViewGroup) datePickerDialog.getDatePicker()).findViewById(Resources.getSystem().getIdentifier("day", "id", "android")).setVisibility(View.GONE);
datePickerDialog.show();

参考此链接Disable day selection on datepicker example

【讨论】:

【参考方案7】:

我有点太晚了,但是在上面发布@ULHAS PATIL 提供的编辑后的答案,以防有人需要同样的东西!

private Calendar mCalendar;
mCalendar = Calendar.getInstance();// Initialize Calendar

xml 布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:background="@color/DarkGrey"
    android:orientation="vertical"
    android:padding="8dp">
    <DatePicker
        android:id="@+id/date_picker"
        android:layout_
        android:layout_
        android:layout_weight="4"
        android:calendarViewShown="false"
        android:theme="@style/DialogTheme"
        android:datePickerMode="spinner" />
    <RelativeLayout
        android:layout_
        android:layout_gravity="end"
        android:layout_>

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/cancel"
            android:layout_
            android:layout_
            android:layout_centerVertical="true"
            android:layout_gravity="start"
            android:layout_marginVertical="20dp"
            android:layout_marginStart="50dp"
            android:background="@android:color/transparent"
            android:gravity="center"
            android:text="@string/cancel"
            android:textAllCaps="false"
            android:textColor="@color/grey"
            android:textSize="20sp" />

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/ok"
            android:layout_
            android:layout_
            android:layout_centerVertical="true"
            android:layout_gravity="end"
            android:layout_marginVertical="20dp"
            android:layout_marginStart="0dp"
            android:layout_marginEnd="10dp"
            android:layout_toEndOf="@id/cancel"
            android:background="@android:color/transparent"
            android:fontFamily="@font/kontora_extra_bold"
            android:gravity="center"
            android:text="@string/ok"
            android:textAllCaps="false"
            android:textColor="@color/CoralRed"
            android:textSize="20sp" />
    </RelativeLayout>
</LinearLayout>

应该有索引0隐藏填充的日期,在ll2.getChildAt(0).setVisibility(View.GONE);并将可见性设置为 View.GONE,因此不占用日期字段的空间。

private void createDialogWithoutDateField() 
    Calendar mCalendar;
    mCalendar = Calendar.getInstance();
    System.out.println("Inside Dialog Box");
    final Dialog dialog = new Dialog(requireContext());
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(R.layout.date_picker_layout);
    dialog.show();

    final DatePicker datePicker = (DatePicker) dialog.findViewById(R.id.date_picker);
    AppCompatButton okBtn = (AppCompatButton) dialog.findViewById(R.id.ok);
    AppCompatButton cancelBtn = (AppCompatButton) dialog.findViewById(R.id.cancel);
    datePicker.init(mCalendar.get(Calendar.YEAR), mCalendar.get(Calendar.MONTH), mCalendar.get(Calendar.DAY_OF_MONTH), null);

    LinearLayout ll = (LinearLayout) datePicker.getChildAt(0);
    LinearLayout ll2 = (LinearLayout) ll.getChildAt(0);
    ll2.getChildAt(0).setVisibility(View.GONE);
    okBtn.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            dialog.dismiss();
            Integer month = datePicker.getMonth() + 1;
            Integer year = datePicker.getYear();
            String expYear = year.toString();
            tvMonthYear.setText(month+ " " + expYear);
        
    );
 cancelBtn.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            dialog.dismiss();
        
    );

【讨论】:

【参考方案8】:

除非你想定制它,否则我认为你不需要那么深入。 有:

mDatePicker.getDatePicker().setCalendarViewShown(false);

这是删除日历段的非常合法的调用。

【讨论】:

此评论来自 2013 年 :) 可能公共 api 已更改并且该调用已弃用?

以上是关于Android - 在 datepickerdialog 中隐藏日期字段的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 4 中启用 android:largeHeap,在 Android 2.3 中禁用它

Android - 在 Android 1.6 中开发的应用程序可以在 Android 2.0 中运行吗?

如何在Android中启动JAVA程序

android中怎么设置组件在LinearLayout中居中

如何在android源代码中打印出日志

求教怎么在android的Logcat中输出日志