Tag, Monat oder Jahr von DatePicker in Android 5.0 oder höher ausblenden Lollipop

Ich habe nach einer Lösung gesucht, um einen der folgenden Spinner vor dem DatePicker zu verbergen. Für Android 5.0 wurden die internen Variablen geändert und in meinem Fall waren die Tag- und Monatssymbole nach dem Update auf meinem Gerät wieder sichtbar.

Android 4.4 und Kitkat Solution

DatePicker dpDate = (DatePicker) findViewById(R.id.dpDate);

    // Initialize Date Picker
    int year    = dpDate.getYear();
    int month   = dpDate.getMonth();
    int day     = dpDate.getDayOfMonth();
    dpDate.init(year, month, day, this);

Field f[] = dpDate.getClass().getDeclaredFields();
            for (Field field : f) 
            {
                // Hides the DAY spinner
                if(field.getName().equals("mDayPicker") || field.getName().equals("mDaySpinner")) 
                {
                    field.setAccessible(true);
                    Object dayPicker = new Object();
                    dayPicker = field.get(dpDate);
                    ((View) dayPicker).setVisibility(View.GONE);
                }

                // Hides the MONTH spinner
                if(field.getName().equals("mMonthPicker") || field.getName().equals("mMonthSpinner")) 
                {
                    field.setAccessible(true);
                    Object monthPicker = new Object();
                    monthPicker = field.get(dpDate);
                    ((View) monthPicker).setVisibility(View.GONE);
                }

                // Hides the YEAR spinner
                if(field.getName().equals("mYearPicker") || field.getName().equals("mYearSpinner")) 
                {
                    field.setAccessible(true);
                    Object yearPicker = new Object();
                    yearPicker = field.get(dpDate);
                    ((View) myearPicker).setVisibility(View.GONE);
                }
            }

Android 5.0+ Lollipop Solution

    DatePicker dpDate = (DatePicker) findViewById(R.id.dpDate);

    // Initialize Date Picker
    int year    = dpDate.getYear();
    int month   = dpDate.getMonth();
    int day     = dpDate.getDayOfMonth();
    dpDate.init(year, month, day, this);

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

            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
            {
                int monthSpinnerId = Resources.getSystem().getIdentifier("month", "id", "android");
                if (monthSpinnerId != 0) 
                {
                    View monthSpinner = dpDate.findViewById(monthSpinnerId);
                    if (monthSpinner != null) 
                    {
                        monthSpinner.setVisibility(View.GONE);
                    }
                }
            }

            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
            {
                int yearSpinnerId = Resources.getSystem().getIdentifier("year", "id", "android");
                if (yearSpinnerId != 0) 
                {
                    View yearSpinner = dpDate.findViewById(yearSpinnerId);
                    if (yearSpinner != null) 
                    {
                        yearSpinner.setVisibility(View.GONE);
                    }
                }
            }

Ich habe die obige Lösung für dieses Problem hier gefunden: Benutzerdefinierter Datumsauswahldialog in Android Lollipop

Ich wollte sicherstellen, dass es leicht zu finden ist, damit andere davon profitieren können, also habe ich diesen neuen Beitrag erstellt. (Die Lösung hat mehrere Stunden gedauert, bis ich sie gefunden und verstanden habe. Ich hoffe, dass ich jemandem dabei helfen kann.)

Ich habe das getestet und es funktioniert einwandfrei. Wenn Sie zuerst die Lösung für den Lollipop und dann darunter im Code die Lösung für Kitkat einfügen, ist sie für beide Versionen ohne Störung kompatibel. (Verwenden Sie unbedingt try / catch;)

EDIT 7.22.2015: Ich dachte, es wäre offensichtlich, dass ein DatePicker initialisiert werden muss, wenn er verwendet wird. Ich habe den Code eingefügt, um zu zeigen, dass Sie den DatePicker initialisieren müssen, bevor Sie den Rest des Codes ausführen (in beiden Situationen), da Ihre Views sonst eine NullPointerException auslösen. Dazu gehört, dass der yearSpinner eine Null wirft. Sie sollten außerdem mindestens eine Ansicht für das Datum haben und nicht alle 3 ausblenden, d. H. Tag, Monat und Jahr nicht gleichzeitig ausblenden.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage