【问题标题】:HIDE year from date picker widget从日期选择器小部件中隐藏年份
【发布时间】:2015-01-08 07:29:17
【问题描述】:

我正在尝试从日期选择器小部件中隐藏年份字段。这可能看起来像是一个重复的问题,但之前的问题给出的答案并没有帮助我隐藏年份字段..

这是我的代码::

@Override 
protected void onCreate(Bundle savedInstanceState) {

    int month = 0;
    int year = 0;
    int day = 0;
    OnDateSetListener datePickerListener = null;
    CustomDatePickerDialog dp = new CustomDatePickerDialog(getBaseContext(), android.R.style.Theme_Holo_Light_Dialog,  datePickerListener, year, month, day);
    DatePickerDialog obj = dp.getPicker();

    picker = (DatePicker) findViewById(R.id.datePicker1);
    try {
          java.lang.reflect.Field[] f = obj.getClass().getDeclaredFields();
  //      Field f[] = picker.getClass().getDeclaredFields();
        for (java.lang.reflect.Field field : f) {
            if (field.getName().equals("prabs")) {
                field.setAccessible(true);
                DatePicker datePicker = (DatePicker) field.get(obj);
                java.lang.reflect.Field datePickerFields[] = obj.getClass().getDeclaredFields();
                for (java.lang.reflect.Field datePickerField : datePickerFields) {
                    if ("mYearPicker".equals(datePickerField.getName()) || "mYearSpinner".equals(datePickerField
                            .getName()))
                    {
                             datePickerField.setAccessible(true);
                             Object yearPicker = new Object();
                             yearPicker = datePickerField.get(datePicker);
                             ((View) yearPicker).setVisibility(View.GONE);
                    }
                }
           /*     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());
    }
    obj.show();
}

在主类之外::

class CustomDatePickerDialog extends DatePickerDialog implements OnDateChangedListener
{
    private DatePickerDialog prabs;

    @SuppressLint("NewApi")
    public CustomDatePickerDialog(Context context, int theme,
            OnDateSetListener listener, int year, int monthOfYear,
            int dayOfMonth) 
    {
        super(context, theme, listener, year, monthOfYear, dayOfMonth);
        // TODO Auto-generated constructor stub
        prabs = new DatePickerDialog(context, theme, listener, year, monthOfYear, dayOfMonth);
        prabs.getDatePicker().init(2015, 01, 8, this);  
        updateTitle(monthOfYear,dayOfMonth);
    }

    private void updateTitle(int Month, int Day)
    {
        // TODO Auto-generated method stub
        Calendar mCalendar = Calendar.getInstance();
        mCalendar.set(Calendar.MONTH, Month);
        mCalendar.set(Calendar.DAY_OF_MONTH, Day);
        prabs.setTitle(getFormat().format(mCalendar.getTime()));
    }

    public SimpleDateFormat  getFormat() {
        // TODO Auto-generated method stub
        return new SimpleDateFormat("MMM, dd");
    }

    public void onDateChanged(DatePicker view,int year, int month,int day)
    {
        updateTitle(month,day);
    }

    public DatePickerDialog getPicker()
    {
        return this.prabs;
    }
}

在添加 obj.show(); 之前,它使用日历显示整个小部件,但我只想要带有日期和月份的小部件

试图从很多天解决这个问题。但每次都失败:( 任何建议都会有很大帮助.. 谢谢。。

编辑::

year 字段表示 Eclipse 的日期选择器部件的年份字段

我提到了How to display year only in date picker in androidCustom Date Picker Dialog

错误日志::

01-09 11:26:20.780: E/AndroidRuntime(23840): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application this is a crash report

【问题讨论】:

  • 任何人都可以帮助解决这个问题
  • 这个任务仍然很麻烦:/
  • 您在使用此代码时遇到了什么问题,其次,如果您遇到了崩溃,请在此处粘贴崩溃日志,这将有助于更好地调查问题
  • 感谢您的关注@Usman..在添加 obj.show() 之前,它正在使用日历显示小部件,但它甚至没有进入该页面,,..我无法追踪哪里出了问题
  • 你在什么设备上测试?

标签: android datepicker field


【解决方案1】:

试试这个,它对我有用。

@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
    case DATE_DIALOG_ID:
        // hide year from datepicker
        DatePickerDialog dlg = new DatePickerDialog(this,
                datePickerListener, year, month, day) {
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                int year = getContext().getResources().getIdentifier(
                        "android:id/year", null, null);
                if (year != 0) {
                    View yearPicker = findViewById(year);
                    if (yearPicker != null) {
                        yearPicker.setVisibility(View.GONE);
                    }
                }
            }
        };
        return dlg;
    }
    return null;
}

【讨论】:

  • 感谢您抽出宝贵时间@MEENAXI..让我试一试。,.
  • onCreate 方法应该在 DatePickerDialog 中??那么如何管理主类@MEENAXI
  • 该链接没有提供有关如何隐藏小部件字段的任何信息。它所有关于设置和更改数据的信息。我提到了this,但它没有隐藏年份字段
【解决方案2】:

试试下面的代码

final Calendar cal = Calendar.getInstance();
mDialog = new CustomerDatePickerDialog(getContext(), this,
cal.get(Calendar.YEAR), cal.get(Calendar.MONTH),
cal.get(Calendar.DAY_OF_MONTH));
mDialog.show();
DatePicker dp = findDatePicker((ViewGroup) mDialog.getWindow().getDecorView());
if (dp != null) {
((ViewGroup) dp.getChildAt(0)).getChildAt(0).setVisibility(View.GONE);
} 

CustomerDatePickerDialog

class CustomerDatePickerDialog extends DatePickerDialog {
 public CustomerDatePickerDialog(Context context, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth) {
     super(context, callBack, year, monthOfYear, dayOfMonth);
 }

 @Override
 public void onDateChanged(DatePicker view, int year, int month, int day) {
     super.onDateChanged(view, year, month, day);
     mDialog.setTitle((month + 1) + "-" + day + "-");
 }
}

日期选择器

   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;

} 

【讨论】:

  • 谢谢@Johnson,让我试一试
  • @Johnson ..抱歉麻烦了,但这里的 mDialog 是什么..它在 mDialog..1) 中的类 CustomerDatePickerDialog 2) 在第二行给出 2 个错误 - [mDialog = new CustomerDatePickerDialog。 ...]所以我将其更改为 [CustomerDatePickerDialog mDialog = new CustomerDatePickerDialog....] 然后该错误消失了...现在另一个错误出现在 getContext()...我已将此代码放在我的主类中“ onCreate"
  • @user4050065 年份选择被禁用。但我可以在我的棒棒糖版本的设备中滚动和选择不同的年份。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多