2012-05-14 11 views
39

Ich wechsele meine alten Dialoge zu DialogFragment, aber die Themen und Stile scheinen nicht zu funktionieren.Thema nicht auf DialogFragment auf Android

Ich verwende das DialogFragment aus der Kompatibilitätsbibliothek v4, und in der onCreate-Methode habe ich versucht, setStyle (Stil, Thema) aufzurufen; mit vielen verschiedenen Themen, aber der Dialog erscheint immer als "alter" Dialog im Emulator mit Android 4.0.3 (d. h. er wird nicht im Holo-Thema angezeigt).

Gibt es noch etwas, was ich tun sollte? Wird durch die Verwendung der Kompatibilitätsbibliothek das Holo-Design oder irgendetwas deaktiviert? Wenn dies der Fall ist, sollte ich zwei DialogFragments erstellen, eines für ältere Versionen und eines für neuere Versionen?

Danke!


Hier ist der (vereinfachte) Code für meinen Dialog. Ich habe sowohl Theme_Holo_Dialog_NoActionBar als auch Theme_DeviceDefault_Dialog_NoActionBar ausprobiert, aber der Android 4-Emulator zeigt den Dialog immer als "alten" Dialog an, anstatt das Holo-Thema zu verwenden. Was mache ich falsch? :(

[...] 
import android.support.v4.app.DialogFragment; 
[...] 

public class AlertDialogFragment extends DialogFragment { 

    public static AlertDialogFragment newInstance(int id) { 

    AlertDialogFragment f = new AlertDialogFragment(); 
    Bundle args = new Bundle(); 
    args.putInt("id", id); 
    f.setArguments(args); 

} 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    int style = DialogFragment.STYLE_NORMAL, theme = 0; 
    theme = android.R.style.Theme_Holo_Dialog_NoActionBar; 
    setStyle(style, theme);  
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

    mId = getArguments().getInt("id"); 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()) 
     .setTitle(mTitle) 
     .setMessage(mMessage) 
     .setPositiveButton(getString(R.string.btn_ok), new DialogInterface.OnClickListener() {  
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       dismiss();     
      } 
     }); 
     return builder.create(); 
    } 
+0

Welche Art sind von Ihnen zu erben, zeigen uns styles.xml auch, was ist Ihr targetSdk? Es muss über 11 sein – Blundell

+0

Ich bin auf SDK 14 ausgerichtet, und ich benutze nicht einmal eine Datei styles.xml, ich rufe nur setStyle (Stil, Thema); In der onCreate-Methode des DialogFragments versuchen mehrere Kombinationen von Stil und Thema. Zum Beispiel, in meinem "alten" Dialog habe ich android.R.style.Theme_DeviceDefault_Dialog_NoActionBar verwendet und es zeigte sich als Holo im ICS-Emulator, aber jetzt mit dem gleichen Thema es nicht tut. – LuTHieR

+0

Versuchen Sie implizit mit Holo: 'android.R.style.Theme_Holo_Dialog' – Blundell

Antwort

25

Ich glaube, Sie brauchen, um das Thema auf dem tatsächlichen Dialog zu setzen und nicht das Fragment

Verwenden Sie diesen Konstruktor Ihren Alertdialog zu erstellen:

AlertDialog.Builder(Context context, int theme) 

dh

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), theme) 
+0

Ich versuche es und es scheint zu arbeiten, danke :) Ich muss nur noch ein paar Tests machen und dann werde ich die Ergebnisse veröffentlichen und Ihre Antwort als akzeptiert markieren . Vielen Dank! – LuTHieR

+0

@LuTHieR Hat dies Ihr Problem gelöst? –

+0

Nicht genau ... am Ende habe ich verschiedene XML-Layout-Dateien für jede Android-Version erstellt, und das schien den Trick zu machen ... – LuTHieR

47

Sie sollten den AlertDialog.Builder (Context, int) -Konstruktor nicht mit der Support-Bibliothek verwenden, da dies der Fall ist erst seit API zur Verfügung ein Thema auf Ihr Dialog 11.

Zur Einstellung verwenden Sie stattdessen eine ContextThemeWrapper wie folgt aus:

ContextThemeWrapper context = new ContextThemeWrapper(getActivity(), android.R.style.Theme_Holo_Dialog_NoActionBar); 
AlertDialog.Builder builder = new AlertDialog.Builder(context); 
+5

Hat jemand das mit benutzerdefinierten Stilen versucht? Wenn ich einen vordefinierten android-Stil übergebe, funktioniert es, aber nicht, wenn ich meinen eigenen Stil übergebe .. (mein benutzerdefinierter Stil ist ein Kind von Theme.Dialog) – ashutosh

+0

Wenn Sie den Builder überhaupt nicht auf eine alternative Weise verwenden (was arbeitete für mich mit benutzerdefinierten Stilen) gegeben ist: http://StackOverflow.com/Questions/13469084/dialogfragment-in-android-with-theme – Almer

-4

Sie sollten diese Codes in „onCreateView“ schreiben.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); 
    View view = inflater.inflate(R.layout.dialog_your_theme, container); 
    return view; 
} 
+0

Während dieser Code-Block die Frage beantworten kann, wäre es am besten, wenn Sie eine bereitstellen könnten wenig Erklärung dafür, warum es so ist. – David

17

Ich verlor nur eine Menge Zeit in Anspruch, aber ich fand schließlich eine Möglichkeit, dies in xml völlig zu tun.

In einem Anwendungsthema sind Dialoge eigentlich thematisch getrennt. Also Stil alle DialogFragments mit grünen Tasten und grünen EditText Hinweise, würden Sie einen Stil wie diese machen:

<style name="DialogTheme" parent="@android:style/Theme.Holo.Light.Dialog"> 
    <item name="android:buttonStyle">@style/button_green</item> 
    <item name="android:textColorHint">@color/green</item> 
</style> 

dann als dialogTheme

<style name="MyTheme" parent="android:Theme.Holo.Light"> 
    <item name="android:dialogTheme">@style/DialogTheme</item> 
</style> 

Vielen Dank wem auch immer, dieses Thema zu Ihrer Anwendung Thema hinzufügen schrieb this post für den Weg zu dem, was ich gesucht hatte!

2

Hier ist eine aktuelle Antwort, mit Ziel SDK von 23 und min SDK von 14, dieser Code funktioniert perfekt für mich.

Die wichtigste Änderung gegenüber dem Code in der Frage ist das Festlegen des Designs im Konstruktor, das Überschreiben von onCreateDialog() und das Verwenden der AlertDialog-Klasse aus der Supportbibliothek v7.

Mit diesem Code werden die grünen, flachen (randlosen) Schaltflächen auf 4.4.4 angezeigt, im Gegensatz zu den standardmäßigen grauen Schaltflächen mit Rahmen.

import android.support.v7.app.AlertDialog; 
import android.app.Dialog; 
import android.support.v4.app.DialogFragment; 
import android.content.DialogInterface; 
import android.os.Bundle; 

public class MyDialog extends DialogFragment { 

    String message; 

    public MyDialog(String m) { 
     message = m; 
     int style = DialogFragment.STYLE_NORMAL, theme = 0; 
     theme = android.R.style.Theme_Holo_Dialog_NoActionBar; 
     setStyle(style, theme); 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     return new AlertDialog.Builder(getActivity()) 
       .setMessage(message) 
       .setPositiveButton("OK", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int whichButton) { 
          ((EnterPhoneNumberActivity)getActivity()).doPositiveClick(); 
         } 
        } 
       ) 
       .setNegativeButton("EDIT", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int whichButton) { 
          ((EnterPhoneNumberActivity)getActivity()).doNegativeClick(); 
         } 
        } 
       ) 
       .create(); 
    } 
} 

Verwendung in einem AppCompatActivity:

String message = "test"; 
    if (message != null) { 
     DialogFragment newFragment = new MyDialog(message); 
     newFragment.show(getSupportFragmentManager(), "dialog"); 
    } 
Verwandte Themen