Anpassen des Layouts eines PreferenceScreen

8

Meine Anforderungen

Hinweis: Ich muss Android API 15 und höher unterstützen.

In meinem PreferenceFragment füge ich PreferenceScreens dynamisch einer PreferenceCategory hinzu.

%Vor%

Wenn die Einstellungen Activity die Darstellung dieser PreferenceScreens mit nur einem Titel in der Zeile wiedergeben, sehen Sie das Bild unten.

Ich möchte anpassen, was in dieser Zeile angezeigt wird. Idealerweise hätte ich gerne einen Titel mit einer Zusammenfassung unten, ein Symbol links neben dem Titel / Zusammenfassung und in bestimmten Zeilen ein Symbol auf der rechten Seite. Siehe das Modellbild unten.

PreferenceScreen.setWidgetLayoutResource (int widgetLayoutResId)

Ich weiß, dass ich "setWidgetLayoutResource" verwenden kann, um ein Symbol rechts neben dem Zeilenlayout (und eine Zusammenfassung mit "setSummary") hinzuzufügen, indem ich den folgenden Code in meiner Einstellungsaktivität verwende

%Vor%

wo "as_widget.xml" ist

%Vor%

Dies wird UI wie folgt erzeugen

Das bringt mich näher an das, was ich möchte, aber immer noch nicht genau das, was ich möchte (das Symbol am Anfang der Zeile fehlt).

PreferenceScreen.setLayoutResource (int layoutResId)

Ich glaube, wenn ich das benutze, kann ich die Wiedergabe der ganzen Zeile steuern. Ich habe Beispiele auf Stackoverflow gesehen, wie

Nach meinem Verständnis muss die Layoutdatei, die Sie angeben, folgendes haben:

  • seine Wurzel Ansicht mit der ID "@android: id / widget_frame"
  • eine Ansicht mit der ID android: id="@ + android: id / title" (hier ist die Die in PreferenceScreen.setTitle angegebene Zeichenfolge wird platziert)
  • eine Ansicht mit der ID android: id="@ + android: id / summary" (das ist wo Die in PreferenceScreen.setSummary angegebene Zeichenfolge wird platziert)

Wenn ich dies jedoch versuche, hebt Android Studio "@ + android: id / summary" mit dem Fehler "Symbol kann nicht aufgelöst werden" @ + android: id / summary hervor. Wenn die Anwendung ausgeführt wird, werden meine Zeilen vollständig gerendert leer.

Mein Java ist

%Vor%

Und mein Layout ist

%Vor%

Erweitern des Präferenzbildschirms

Ich habe den erweiterten PreferenceScreen betrachtet, um zu überschreiben, wie er gerendert wird, aber es scheint, dass diese Klasse jetzt endgültig gemacht wurde, also können alle Beispiele im Internet, die es so machen, nicht verwendet werden.

    
se22as 30.01.2015, 16:42
quelle

2 Antworten

13

Ich habe es geschafft, dass das funktioniert.

Die Klasse Preference verwendet com.android.internal.R.layout.preference als Layout. Dies enthält eine ImageView für ein Symbol auf der linken Seite, dann die Titel- und Zusammenfassungstextansichten und schließlich ein widget_frame Layout auf der rechten Seite.

Indem Sie " PreferenceScreen.setIcon(..) " aufrufen, können Sie festlegen, dass das Zeichen in der Symbolbildansicht platziert werden soll. Wenn Sie PreferenceScreen.setWidgetLayoutResource("...") aufrufen, können Sie festlegen, dass das Layout im widget_frame -Layout platziert wird. In meinem Fall lege ich ein ImageView-Layout mit meinem Bild an.

Hier ist mein Java-Code.

%Vor%

Dies erzeugt ein Layout wie das Folgende

Das Problem mit diesem Layout besteht darin, dass die Symbole nicht mit dem Text der Einstellungen darunter ausgerichtet sind, die keine Symbole haben.

Dies kann durch Angabe des Layouts für PreferenceScreen ebenfalls gelöst werden. Ich habe Androids preference.xml in mein Projekt kopiert (indem ich es für meinen Anwendungsfall umbenannt habe) und ich habe ImageView so geändert, dass es einen linken Abstand und einen Rand von 0dp hat.

Von

%Vor%

bis

%Vor%

Ich habe dann meine Kopie von preference.xml für das Layout des PreferenceScreen angegeben. Also mein Java ist jetzt

%Vor%

Ich glaube, der Grund, warum mein ursprünglicher Versuch, PreferenceScreen.setLayoutResource zu verwenden, nicht funktionierte, lag daran, dass das von mir angegebene Layout falsch war. Das falsche Layout hatte das ganze Layout mit der ID @android:id/widget_frame , d. H.

%Vor%

Das richtige Layout benötigt keine ID für das Hauptlayout, sondern muss untergeordnete Ansichten mit den IDs @+android:id/icon , @+android:id/title , @+android:id/summary , @+android:id/widget_frame , dh %Vor%     

se22as 02.02.2015, 10:14
quelle
0

Sie können das Layout einer Voreinstellung auch anpassen, indem Sie Preference.onCreateView(parent) überschreiben. Das folgende Beispiel verwendet eine anonyme innere Klasse, um rote Voreinstellungen vorzunehmen.

%Vor%     
Roger Keays 03.05.2016 17:08
quelle