5

Я хочу, чтобы выбор даты показывал только месяц и год. Я настроил Date Picker, чтобы сделать это, например, чтобы удалить поле «день» из сборщика, но в Android Lollipop Am появляется сборщик с днем, месяцем и годом. Ниже приводится моя часть кода. Пожалуйста, помогите мне узнать проблему. Заранее спасибо.Пользовательский диалог выбора даты в Android Lollipop

try { 
     Field f[] = mDatePicker.getClass().getDeclaredFields(); 
     for (Field field : f) { 

      if (field.getName().equals("mDaySpinner") || field.getName().equals("mDayPicker")) { 
       field.setAccessible(true); 
       Object dayPicker = new Object(); 
       dayPicker = field.get(mDatePicker); 
       ((View) dayPicker).setVisibility(View.GONE); 
      } 

     } 
    } catch (SecurityException e) { 
    } catch (IllegalArgumentException e) { 
    } catch (IllegalAccessException e) { 
    } 
+0

Что не работает? Сбой приложения? Если да, разместите stacktrace. –

+0

отображение день тоже, что неверно в моем случае. Он должен отображать только месяц и год. Правильно работает до Китката. –

+1

IMHO доступ к внутренним функциям в классе выбора даты - это плохая практика. Вы зависите от соответствующих полей, имеющих определенные имена; если имена меняются ... Я думаю, вам лучше реализовать свой собственный виджет с двумя обычными числовыми прядильщиками. –

ответ

10

С помощью отражения, чтобы найти и скрыть элементы пользовательского интерфейса не очень большая практика. В вашем случае он перестает работать на леденец, потому что mDaySpinner теперь содержится во внутреннем частном статическом классе DatePickerSpinngerDelegate в классе DatePicker.

Я бы рекомендовал пройти через иерархию представлений, чтобы вместо этого найти и спрятать элемент спиннинга дня. Я написал следующий код, который работает в леденец:

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

работает как шарм !! – Orr

+0

great works man –

+0

@alanv Пример кода в этом ответе _not_ использует отражение. На самом деле, этот ответ конкретно советует не использовать размышления, говоря, что это не очень хорошая практика. Возможно, вы указали свой комментарий для примера кода в исходном вопросе, который фактически использует отражение. – cse

0

Это базовый пример месяца сборщика, но могут быть легко приспособлены к добыванию также год и/или день (работает также и для более старых андроид версии):

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); 
     } 
    } 
} 

}

-1

пошел вперед сделать модифицирована Date Picker под названием Simple Дата выбора ... использовали код, аналогичный Выбор даты, чтобы показать месяц и год

см. https://github.com/resengupta/Month-Year-Date-Picker

Класс SimpleDatePickerDialog.java несет ответственность за показ выбора месяца и года. SimpleDatePickerDelegate.java работает, чтобы применять правила к сборщикам чисел. SimpleDatePickerDialogFragment.java - это диалоговое окно диалога, которое обертывает диалоговое окно предупреждения.

Смежные вопросы