2012-05-01 20 views
13

Używam podstawowego DatePicker i próbuję dowiedzieć się, jak ukryć pole Year na DatePickerDialog, tak aby widoczne były tylko miesiąc i dzień. Nie mam nic przeciwko temu, że leżałby tam podstawowy kod roku, chciałbym ukryć pole roku w oknie dialogowym. Wiesz z czymś podobnym:Ukryj pole roku w Androidzie DatePicker?

((View) myYear).setVisibility(View.GONE); 

co, jak wiem, nie działa, ponieważ myYear jest int nie widokiem, ale czymś podobnym. Czy to możliwe?

+0

http://code.google.com/p/android-wheel/ zobaczyć ten link. to ci pomoże ... – MAC

Odpowiedz

22

super łatwy sposób, że znalazłem wdrożyć datepicker jest wywołanie go w xml:

<DatePicker 
    android:id="@+id/thePicker" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"/> 

a następnie ukryć cokolwiek pole, które chcesz (w tym przypadku roku) w Java:

picker = (DatePicker) findViewById(R.id.thePicker); 
    try { 
     Field f[] = picker.getClass().getDeclaredFields(); 
     for (Field field : f) { 
      if (field.getName().equals("mYearPicker")) { 
       field.setAccessible(true); 
       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()); 
    } 
+12

Możesz zamienić 'if (field.getName(). Equals (" mYearPicker ")) {' z 'if (field.getName(). Equals (" mYearPicker ") | | field.getName(). equals ("mYearSpinner")) {' w celu uwzględnienia widżetu DatePicker w Honeycomb i wyższych wersjach Androida ... –

+2

dla najnowszych Androidów, a także ukrywania" mCalendarView " – YKS

8

Bądź naprawdę ostrożny z tym rozwiązaniem. używasz refleksów, aby uzyskać dostęp do pola i zmienić widoczność. To nie zadziała z Androidem 5.0! Google zmienił implementację TimePicker i DatePicker, a klasy nie wystawiają już żadnych pól od delegata.

Nie znam jeszcze rozwiązania na Androida 5.0 +. Poinformuję Cię, gdy tylko znajdę coś interesującego.

Jako pomysł można użyć Build.VERSION.SDK_INT, aby sprawdzić wersję Androida, a następnie spróbuj uzyskać dostęp do DatePickerSpinnerDelegate za pomocą refleksji i ustawić żądane pole.

Ponownie, nie jest to idealne rozwiązanie, jak Google są darmowe znowu i znowu to zmienić ...

+0

, więc jakie jest rozwiązanie dla Androida 5.0+? – RDD

+0

Nigdy nie znalazłem żadnego dobrego rozwiązania. Do naszego projektu użyłem po prostu dostarczonego DatePicker z wyborem roku ... Możesz również rzucić okiem na ten https://android-arsenal.com/tag/27. Może być przydatny, jeśli szukasz dostosowywanej biblioteki DatePicker. – rontho

+1

Utworzono niestandardowy komponent, wykonując [this] (http://stackoverflow.com/questions/21321789/android-datepicker-change-to-only-month-and-year) i dostałem to, czego chcę. – RDD

1

Łatwy sposób pole letnią wyłączyć w wyboru daty

DatePicker dp = findDatePicker((ViewGroup) dialog.getWindow().getDecorView()); 

if(dp != null) 
{ 
    ((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0)).getChildAt(2).setEnabled(false); 
    ((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0)).getChildAt(2).setAlpha(0.4f); 
} 

jeśli chcesz usunąć rok pola tylko setvisibility wyniku celu View.GONE jak poniżej

dp.getChildAt(0)).getChildAt(0)).getChildAt(2).setVisibility(View.GONE) 



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; 

} 

ja skieruję poniżej linku odsyłającego Remove year from DatePickerDialog

+0

ulega awarii w systemie Android 7 - próba wywołania metody wirtualnej "void android.view.View.setVisibility (int)" w odwołaniu do obiektu o wartości NULL –

1

Można ustawić zakres roku za pomocą tej funkcji

datePicker.setYearRange(1950,2017); 
Powiązane problemy