Thema für ein Fragment festlegen

Ich versuche das Thema für ein Fragment festzulegen.

Das Festlegen des Themas im Manifest funktioniert nicht:

android:theme="@android:style/Theme.Holo.Light" 

Beim Betrachten früherer Blogs scheint es so, als ob ich einen ContextThemeWrapper verwenden müsste. Kann mich jemand auf ein codiertes Beispiel verweisen? Ich kann nichts finden.

   

    Das Festlegen von Theme in Manifest wird normalerweise für Aktivität verwendet.

    Wenn Sie Theme für Fragment festlegen möchten, fügen Sie den folgenden Code in onCreateView () des Fragments hinzu:

     @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // create ContextThemeWrapper from the original Activity Context with the custom theme final Context contextThemeWrapper = new ContextThemeWrapper(getActivity(), R.style.yourCustomTheme); // clone the inflater using the ContextThemeWrapper LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper); // inflate the layout using the cloned inflater, not default inflater return localInflater.inflate(R.layout.yourLayout, container, false); } 

    Ich versuchte auch, meinen Fragmentdialog mit einem anderen Thema als seiner Aktivität anzuzeigen, und folgte dieser Lösung . Wie einige Personen, die in den Kommentaren erwähnt wurden, habe ich es nicht zum Laufen gebracht und der Dialog wurde weiterhin mit dem im Manifest angegebenen Thema angezeigt. Das Problem stellte sich heraus, dass ich den Dialog mithilfe von AlertDialog.Builder in der onCreateDialog Methode erstellte und daher die onCreateDialog Methode nicht verwendete, wie in der Antwort gezeigt, mit der ich verlinkt habe. Und als ich den AlertDialog.Builder instanziiert habe, AlertDialog.Builder ich den Kontext mit getActivity() als ich eigentlich den instanziierten ConstextThemeWrapper verwenden sollen.

    Hier ist der Code für meinen onCreateDialog:

     @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Create ContextThemeWrapper from the original Activity Context ContextThemeWrapper contextThemeWrapper = new ContextThemeWrapper(getActivity(), android.R.style.Theme_DeviceDefault_Light_Dialog); LayoutInflater inflater = getActivity().getLayoutInflater().cloneInContext(contextThemeWrapper); // Now take note of the parameter passed into AlertDialog.Builder constructor AlertDialog.Builder builder = new AlertDialog.Builder(contextThemeWrapper); View view = inflater.inflate(R.layout.set_server_dialog, null); mEditText = (EditText) view.findViewById(R.id.txt_server); mEditText.requestFocus(); // Show soft keyboard automatically mEditText.setOnEditorActionListener(this); builder.setView(view); builder.setTitle(R.string.server_dialog); builder.setPositiveButton(android.R.string.ok, this); Dialog dialog = builder.create(); dialog.setCanceledOnTouchOutside(false); return dialog; } 

    Ich hatte ursprünglich den AlertDialog.Builder wie folgt instanziiert:

     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

    was ich geändert habe zu:

     AlertDialog.Builder builder = new AlertDialog.Builder(contextThemeWrapper); 

    Nach dieser Änderung wurde der Fragmentdialog mit dem richtigen Thema angezeigt. Wenn also ein anderer AlertDialog.Builder ein ähnliches Problem hat und den AlertDialog.Builder überprüfen Sie den Kontext, der an den Builder übergeben wird. Hoffe das hilft! 🙂

    Fragment nimmt sein Thema von seiner Aktivität. Jedes Fragment erhält das Thema der Aktivität, in der es existiert.

    Das Design wird in der Fragment.onCreateView-Methode angewendet, wobei der Code Ansichten erstellt, bei denen es sich tatsächlich um Objekte handelt, für die ein Thema verwendet wird.

    In Fragment.onCreateView erhalten Sie den Parameter LayoutInflater, der die Ansichten aufbläht, und er hält den Kontext, der für das Thema verwendet wird. Tatsächlich ist dies die Aktivität. Daher verwenden deine überhöhten Ansichten das Thema “Aktivität”.

    Um das Thema zu überschreiben, können Sie LayoutInflater.cloneInContext aufrufen , das in Google Docs erwähnt, dass es zum Ändern des Designs verwendet werden kann. Sie können ContextThemeWrapper hier verwenden. Verwenden Sie dann geklonten Inflater, um die Ansichten des Fragments zu erstellen.

    android:minSdkVersion="11" Sie sicher, dass Sie android:minSdkVersion="11" in Ihrem Manifest festgelegt haben. Dies könnte der Grund sein, warum Davids Beispiel für dich nicht funktioniert hat.

    Setzen Sie außerdem das Attribut android:theme="@android:style/Theme.Holo.Light" für das -Tag und NICHT das -Tag.

    Ein anderes mögliches Problem könnte die Art sein, wie Sie Ihren Kontext erhalten, wenn Sie einen ContextThemeWrapper() . Wenn Sie etwas wie getActivity().getApplicationContext() ersetzen Sie getActivity() stattdessen durch getActivity() .

    Normalerweise sollte Theme.Holo auf Fragmente angewendet werden, die mit der MainActivity 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 das Codeelement von Ihrer MainActivity aus bereitstellen, wo Sie Ihre Fragmente hinzufügen.

    Einige nützliche Links:

    Benutzerdefiniertes ListView in Fragment, das nicht zum übergeordneten Thema passt

    Für die Anwendung eines einzigen Stils habe ich nur verwendet

     getContext().getTheme().applyStyle(styleId, true); 

    in onCreateView() des Fragments vor dem Aufblasen Root-Ansicht des Fragments und es funktioniert für mich.

    Ich habe versucht, die Lösung, die David vorgeschlagen hat, funktioniert, aber nicht in allen Szenarien:
    1. Für das erste Fragment, das zu dem Stapel hinzugefügt wurde, hat es das Thema der Aktivität und nicht dasjenige, das in onCrateView definiert wurde, aber auf dem zweiten Fragment, das ich dem Stapel hinzufüge, wurden sie auf das Fragment angewendet.

    2. Auf dem zweiten Fragment, dass die sie korrekt angezeigt wurde, habe ich folgendes getan Ich zwang die App geschlossen zu werden, indem ich den Speicher säubere, die App wieder öffne und wenn die Aktivität mit dem Fragment neu erstellt wurde die Aktivität und nicht die gleiche, die in der onCrateView des Fragments festgelegt wurde.

    Um das Problem zu beheben, habe ich eine kleine Änderung vorgenommen und das Container-Argument von der inflater.inflate durch eine Null ersetzt.

    Ich weiß nicht, wie der Inflator in einigen Szenarien den Kontext aus der Containeransicht verwendet.

    Beachten Sie, dass ich android.support.v4.app.Fragment & android.support.v7.app.AppCompatActivity verwendet.

     @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // create ContextThemeWrapper from the original Activity Context with the custom theme final Context contextThemeWrapper = new ContextThemeWrapper(getActivity(), R.style.yourCustomTheme); // clone the inflater using the ContextThemeWrapper LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper); // inflate the layout using the cloned inflater, not default inflater return localInflater.inflate(R.layout.yourLayout, null, false); } 

    Erstellen Sie eine Java-class und verwenden Sie dann das Layout, das Sie in der onCreate-Methode ändern möchten. Erwähnen Sie es dann in der Manifest-Datei als normal

    Ich triggerse das Problem mit android:theme = "@style/myTheme" in der Layout-Datei des Fragments. Zum Beispiel ändert dies den Stil des LinearLayout und seinen Inhalt, aber nichts außerhalb des LinearLayout . Um also das ganze Fragment mit einem beliebigen Stil zu dekorieren, wenden Sie das Thema auf sein äußerstes Elternlayout an.

          

    Sie können dies in OnAttach für Lollipop versuchen

    letztes Fenster window = activity.getWindow (); window.setStatusBarColor (myStatusBarColor)

    und setze es in ontdetach auf Standard zurück

    Wenn Sie nur einen Stil für ein bestimmtes Fragment anwenden möchten, fügen Sie einfach diese Zeilen hinzu, bevor Sie onCreateView() oder onAttach() des Fragments aufrufen.

     getActivity().getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); getActivity().getWindow().setStatusBarColor(Color.TRANSPARENT); 

    und Wenn Sie eine transparente Statusleiste setzen möchten, setzen Sie false auf die fitsSystemWindows Eigenschaft Ihres Root-Layouts.

     android:fitsSystemWindows="false"