Ich versuche, das Thema für ein Fragment festzulegen.
Das Festlegen des Themas im Manifest funktioniert nicht:
android:theme="@android:style/Theme.Holo.Light"
Aus früheren Blogs geht hervor, dass ich einen ContextThemeWrapper verwenden muss. Kann mich jemand auf ein codiertes Beispiel verweisen? Ich kann nichts finden
android
android-fragments
android-theme
user1232691
quelle
quelle
Fragment nimmt sein Thema von seiner Aktivität. Jedem Fragment wird das Thema der Aktivität zugewiesen, in der es vorhanden ist.
Das Thema wird in der Fragment.onCreateView-Methode angewendet, bei der Ihr Code Ansichten erstellt, bei denen es sich tatsächlich um Objekte handelt, bei denen das Thema verwendet wird.
In Fragment.onCreateView erhalten Sie den Parameter LayoutInflater, der die Ansichten aufbläst und den für das Thema verwendeten Kontext enthält. Dies ist eigentlich die Aktivität. Ihre aufgeblasenen Ansichten verwenden also das Thema der Aktivität.
Um das Thema zu überschreiben, können Sie LayoutInflater.cloneInContext aufrufen , in dem in den Dokumenten erwähnt wird, dass es zum Ändern des Themas verwendet werden kann. Sie können ContextThemeWrapper hier verwenden. Verwenden Sie dann den geklonten Inflater, um die Ansichten des Fragments zu erstellen.
quelle
Für die Anwendung eines einzelnen Stils habe ich gerade verwendet
in
onCreateView()
des Fragments vor dem Aufblasen der Wurzelansicht des Fragments und es funktioniert für mich.quelle
getContext()
Ich habe auch versucht, meinen Fragmentdialog mit einem anderen Thema als seiner Aktivität anzuzeigen, und bin dieser Lösung gefolgt . Wie einige in den Kommentaren erwähnte Personen haben ich es nicht zum Laufen gebracht und der Dialog wurde immer wieder mit dem im Manifest angegebenen Thema angezeigt. Es stellte sich heraus, dass ich den Dialog mit
AlertDialog.Builder
deronCreateDialog
Methode erstellt habe und daher dieonCreateView
Methode nicht wie in der Antwort, mit der ich verlinkt habe, verwendet habe. Und als ich das instanziierte,AlertDialog.Builder
übergab ich im Kontext,getActivity()
wann ichConstextThemeWrapper
stattdessen das instanziierte hätte verwenden sollen.Hier ist der Code für meinen onCreateDialog:
Ich hatte das
AlertDialog.Builder
Wesen ursprünglich wie folgt instanziiert:was ich geändert habe zu:
Nach dieser Änderung wurde der Fragmentdialog mit dem richtigen Thema angezeigt. Wenn also jemand anderes ein ähnliches Problem hat und das verwendet,
AlertDialog.Builder
überprüfen Sie den Kontext, der an den Builder übergeben wird. Hoffe das hilft! :) :)quelle
Stellen Sie sicher, dass Sie
android:minSdkVersion="11"
in Ihrem Manifest festgelegt haben. Dies könnte der Grund sein, warum Davids Beispiel für Sie nicht funktioniert hat.Legen Sie außerdem das
android:theme="@android:style/Theme.Holo.Light"
Attribut für das<application>
Tag und NICHT das<activity>
Tag fest.Ein weiteres mögliches Problem könnte die Art und Weise sein, wie Sie Ihren Kontext erhalten, wenn Sie a verwenden
ContextThemeWrapper()
. Wenn Sie so etwas wie verwenden,getActivity().getApplicationContext()
ersetzen Sie esgetActivity()
stattdessen durch.Normalerweise sollte das Theme.Holo für Fragmente gelten, die mit der Hauptaktivität verknüpft sind.
Bitte beachten Sie, dass Sie einen ContextThemeWrapper verwenden, wenn Sie ein anderes Thema für Ihr Fragment anwenden möchten . Es kann hilfreich sein, wenn Sie den Code aus Ihrer MainActivity bereitstellen, in dem Sie Ihre Fragmente hinzufügen.
Einige nützliche Links:
Benutzerdefinierte ListView in Fragment, die nicht dem übergeordneten Thema entspricht
quelle
Ich habe die von David vorgeschlagene Lösung ausprobiert, aber nicht in allen Szenarien:
1. Für das erste Fragment, das dem Stapel hinzugefügt wurde, ist das Thema der Aktivität und nicht das in onCrateView definierte, sondern das zweite Fragment, das i Zum Stapel hinzufügen, richtig, sie wurden auf das Fragment angewendet.
2. Auf dem zweiten Fragment, auf dem sie korrekt angezeigt wurden, habe ich Folgendes getan: Ich habe die App durch Bereinigen des Speichers geschlossen, die App erneut geöffnet und als die Aktivität mit dem Fragment neu erstellt wurde, hat das Fragment die falschen Werte geändert die Aktivität und nicht dieselbe, die in der onCrateView des Fragments festgelegt wurde.
Um das Problem zu beheben, habe ich eine kleine Änderung vorgenommen und das Container-Argument aus der inflater.inflate durch eine Null ersetzt.
Ich weiß nicht, wie der Inflater in einigen Szenarien den Kontext aus der Containeransicht verwendet.
Hinweis - dass ich android.support.v4.app.Fragment & android.support.v7.app.AppCompatActivity verwende.
quelle
Ich weiß, dass es etwas spät ist, aber es könnte jemand anderem helfen, weil mir das geholfen hat. Sie können auch versuchen, die folgende Codezeile in die onCreatView-Funktion des Fragments einzufügen
quelle
Erstellen Sie eine Java-Klasse und verwenden Sie dann das Layout, dessen Thema Sie in der onCreate-Methode ändern möchten. Erwähnen Sie es dann wie gewohnt im Manifest
quelle
Wenn Sie nur den Stil für ein bestimmtes Fragment anwenden möchten, fügen Sie diese Zeilen einfach vor dem Aufruf
onCreateView()
oderonAttach()
des Fragments hinzu.und Wenn Sie eine transparente Statusleiste festlegen möchten, setzen Sie false auf die
fitsSystemWindows
Eigenschaft Ihres Root-Layouts.quelle
Ich habe es zum Laufen gebracht, indem ich das Thema auf den Fragmentkontext gesetzt habe, bevor ich den Inflator aufgerufen habe.
HINWEIS: Dies ist ein Beispiel für Xamarin.Android in Kombination mit MvvmCross. Ich bin mir nicht 100% sicher, ob dies auch für die Java-Programmierer funktioniert. Aber du kannst es versuchen :)
Der Code der SetTheme-Erweiterungsmethode
Ich hoffe das hilft einigen Leuten, Prost!
quelle
Ich habe das Problem mithilfe
android:theme = "@style/myTheme"
der Layoutdatei des Fragments gelöst . Zum Beispiel ändert dies den Stil desLinearLayout
und seinen Inhalt, aber nichts außerhalb desLinearLayout
. Um das gesamte Fragment mit einem beliebigen Stil zu dekorieren, wenden Sie das Thema auf das äußerste übergeordnete Layout an.Hinweis: Falls Sie noch keine Lösung gefunden haben, können Sie sie ausprobieren.
quelle
Sie können dies für Lutscher in onAttach versuchen
letztes Fenster window = activity.getWindow (); window.setStatusBarColor (myStatusBarColor)
und setzen Sie es in ondettach auf den Standard zurück
quelle