10

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

任何帮助都会非常有用。

4

8 回答 8

13

我不建议使用反射来做这种事情。

有一种更简单、更漂亮的方法可以做到这一点:

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

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

于 2014-11-03T18:41:52.497 回答
6
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 中的日期字段。

参考这个链接

于 2012-05-20T13:32:50.537 回答
6

源代码可供您克隆、重构到您自己的包中,并根据需要进行修改DatePickerDatePickerDialog

于 2012-05-20T13:39:54.810 回答
1
    private Calendar mCalendar;
    mCalendar = Calendar.getInstance();// Initialize Calendar

dialog_date_picker.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/rounded_corners"
android:orientation="vertical"
android:padding="8dp">
<DatePicker
    android:id="@+id/date_picker"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="4"
    android:calendarViewShown="false"
    android:datePickerMode="spinner" />
<Button
    android:id="@+id/date_time_set"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    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 中,因此我可以显示卡片的到期日期。享受!!

于 2016-03-17T06:06:23.130 回答
1
((ViewGroup) datePickerDialog.getDatePicker()).findViewById(Resources.getSystem().getIdentifier("day", "id", "android")).setVisibility(View.GONE); 

这工作正常

于 2016-12-12T09:41:21.403 回答
0
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

于 2016-12-02T12:58:16.520 回答
0

我有点太晚了,但是在上面发布@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_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/DarkGrey"
    android:orientation="vertical"
    android:padding="8dp">
    <DatePicker
        android:id="@+id/date_picker"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="4"
        android:calendarViewShown="false"
        android:theme="@style/DialogTheme"
        android:datePickerMode="spinner" />
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_gravity="end"
        android:layout_height="wrap_content">

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/cancel"
            android:layout_width="wrap_content"
            android:layout_height="25dp"
            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_width="48dp"
            android:layout_height="25dp"
            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();
        }
    });
}
于 2022-01-24T20:17:12.540 回答
-4

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

mDatePicker.getDatePicker().setCalendarViewShown(false);

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

于 2013-07-10T15:00:04.830 回答