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】:
DatePicker
和 DatePickerDialog
的源代码可供您克隆、重构到您自己的包中并进行修改以适应。
【讨论】:
【参考方案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 中运行吗?