Preference Screen Custom Layout funktioniert nur mit einem zweiten Klick

9

Ich habe einen Einstellungsbildschirm, der ein benutzerdefiniertes Layout verwendet:

%Vor%

Bei diesem Problem wird das Layout beim ersten Versuch nicht angezeigt. Wie Sie aus dem animierten Gif unten sehen können, muss ich mich zurückziehen und ein zweites Mal versuchen, das Layout zu erstellen. Nun, warum ist das so?

preferences.xml

%Vor%

Was folgt, ist das benutzerdefinierte Layout, das verwendet wird. Es enthält eine GridView.

currencycodes.xml

%Vor%     
Drawn 17.01.2017, 23:31
quelle

3 Antworten

1

Ich habe einen Workaround gefunden. Ich habe festgestellt, dass beim Aufblasen eines Layouts in LayoutInflater.java eine statische Hashmap zum Sammeln von Ansichtsobjekten verwendet wird:

%Vor%

Was passiert, ist, dass der erste Klick den LayoutInflater aufruft, aber dieser erste Klick fügt nur die Gridview-Ansicht in der statischen hashmap hinzu. Sie werden sehen, dass mit dem ersten Klick der Befehl sConstructorMap.get(name) nur null zurückgibt:

%Vor%

Im LayoutInflater ist die Variable mPrivateFactory tatsächlich Ihre Hauptaktivität. Dort wird meine Gridview in mPrivateFactory.onCreateView () initialisiert. Mit dem ersten Klick gibt mPrivateFactory.onCreateView () jedoch null zurück, da das statische hashmap die Ansicht der Gridview noch nicht hat. Es ist weiter unten in der Befehlszeile, onCreateView(parent, name, attrs); , wo es schließlich hinzugefügt wird:

%Vor%

Also, bis ich eine elegantere Lösung gefunden habe, rufe ich einfach die Methode onCreateView(parent) an, zweimal, wenn diese bestimmte Präferenz zum ersten Mal angeklickt wird. Der erste Aufruf fügt die Gridview zur statischen hashmap hinzu, der zweite Aufruf instanziiert die Layoutansicht (wieder), initialisiert aber diesmal die Gridview in der eigenen onCreateView-Methode der eigenen Activity, mPrivateFactory.onCreateView() :

%Vor%     
Drawn 27.01.2017, 15:20
quelle
2

Nun, zuerst müssen Sie verstehen, wie PreferenceScreen funktioniert?

Aus [Android Dokumentation] [1]:

  

Wenn es in einer anderen Präferenzhierarchie angezeigt wird, wird es angezeigt und   dient als Gateway zu einem anderen Bildschirm von Einstellungen (entweder durch   einen anderen Bildschirm mit Einstellungen als Dialog oder über   startActivity (android.content.Intent) von getIntent ()). Das   Kinder dieses PreferenceScreen werden auf dem Bildschirm NICHT angezeigt   Dieser PreferenceScreen wird angezeigt. Stattdessen wird ein separater Bildschirm angezeigt   angezeigt, wenn diese Einstellung angeklickt wird.

In einfachen Worten,

Das Präferenz-Framework übernimmt die Anzeige dieser anderen Bildschirme aus der Präferenzhierarchie. Dieses PreferenceScreen-Tag dient als Bildschirmunterbrechung (ähnlich wie beim Seitenumbruch bei der Textverarbeitung). Wie bei anderen Voreinstellungstypen weisen wir hier einen Schlüssel zu, um den Instanzstatus speichern und wiederherstellen zu können.

In Ihrem Fall wird " Anwendungsvorgaben " als Root der Hierarchie verwendet und einer PreferenceActivity zugewiesen. Der erste Bildschirm zeigt die Voreinstellungen " Url_Setting "und" Währungscodes ". Die " Währungscodes " sind die " second_preferencescreen ". Wenn Sie darauf klicken, wird ein weiterer Bildschirm mit den Einstellungen " Währungsaustausch " angezeigt als untergeordnete Elemente des Tags " second_preferencescreen ", dh Währungscodes .

Also, warum wird es nicht beim ersten Klick angezeigt ... aber auf den zweiten Klick hoffe du hast wie der Präferenz-Bildschirm funktioniert ...

Wenn Sie noch irgendwelche Zweifel haben ... lassen Sie es mich wissen ... Ссылка

    
PN10 21.01.2017 19:48
quelle
1

Versuchen Sie, Ihre if -Anweisung von

zu ändern %Vor%

bis

%Vor%     
Matthew Shearer 18.01.2017 19:44
quelle

Tags und Links