2013-02-21 15 views
27

Sto costruendo una custom DialogFragment. Il layout della finestra di dialogo è impostato su my_dialog.xml, ma come posso modificare il colore attorno alla finestra di dialogo (il grigio trasparente)?Come cambiare il colore di sfondo attorno a un DialogFragment?

enter image description here

my_dialog.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" > 

    <TextView 
     android:id="@+id/hello" 
     android:layout_width="100dp" 
     android:layout_height="100dp" 
     android:background="@android:color/holo_orange_light" 
     android:gravity="center" 
     android:text="hello" /> 

</RelativeLayout> 

MyDialogFragment.java

public class MyDialogFragment extends DialogFragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.my_dialog, container); 

     getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); 

     return view; 
    } 
} 

risposta

37

ho dovuto impostare android:windowIsFloating su false e android:windowBackground al mio colore personalizzato in stile finestra di dialogo:

styles.xml

<resources xmlns:android="http://schemas.android.com/apk/res/android"> 

    <style name="MyDialog" parent="@android:style/Theme.Dialog"> 
     <item name="android:windowFrame">@null</item> 
     <item name="android:windowBackground">@color/orange_transparent</item> 
     <item name="android:windowIsFloating">false</item> 
     <item name="android:windowContentOverlay">@null</item> 
     <item name="android:windowTitleStyle">@null</item> 
     <item name="android:colorBackgroundCacheHint">@null</item> 
     <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item> 
     <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item> 
     <item name="android:gravity">center</item> 
    </style> 

</resources> 

MyDialogFragment

public class MyDialogFragment extends DialogFragment { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setStyle(DialogFragment.STYLE_NO_TITLE, R.style.MyDialog); 
    } 
} 
+0

Funziona, grazie mille. Questa finestra di dialogo con il comportamento degli stili è davvero strana e poco chiara. –

+2

Si noti che se si modifica 'windowBackground' in un colore, si perde lo stile predefinito della finestra DialogFragment con gli angoli arrotondati. Per preservare questo devi creare un rect drawable con il colore come sfondo (cioè il parametro solido) e utilizzare gli angoli con un valore raggio. –

+0

come farlo nella classe Dialog? Voglio dire, estendo Dialog, non DialogFragment e non ho setStyle() ... – sasan

0

cambiare la vostra Testo Background sul XML ho appena modificato il codice di sostituirlo ingegno h vostro

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_gravity="center" > 

<TextView 
    android:id="@+id/hello" 
    android:layout_width="100dp" 
    android:layout_height="100dp" 
    android:gravity="center" 
    android:text="hello" /> 

perché ti ha dato l'altezza e la larghezza di TextView 100dp. e impostarne uno sfondo che riempirà l'intera finestra di dialogo. dato che il tuo layout principale è wrap_content. per favore accetta la risposta se questo ti ha aiutato.
Modifica: per modificare background aggiungi al tuo layout o alla tua visualizzazione di testo android:background="#232323" puoi cambiare questi numeri in qualsiasi colore che ti piace. oppure è possibile impostare uno sfondo dalla drawable come android:background="@drawable/yourpicturename"

+0

ho già impostato di sfondo uno sfondo al mio TextView. Il mio problema è il colore * attorno * al TextView. – jul

+0

il colore è causato impostando lo sfondo nel tuo textView come questo android: background = "@ android: color/holo_orange_light" ho cancellato questo dal tuo layout. potresti copiare e incollare il mio codice sopra e vedere come funzionerà! – k0sh

+0

Sì, lo so, e lo voglio in questo modo. Voglio modificare il colore grigio attorno ad esso. – jul

15

ho trovato ho solo bisogno di fare questo:

<style name="MyDialog" parent="@android:style/Theme.Dialog"> 
    <!-- other attributes --> 
    <item name="android:backgroundDimEnabled">false</item> 
</style> 
+1

Funziona perfettamente :) –

+0

Sembra che questa dovrebbe essere la risposta accettata. L'xml della risposta accettata cambia il colore della parte arancione dello screenshot oltre a rimuovere la parte grigia. –

+0

Questa è la risposta giusta. – KingWu

2

Esclusione onCreate e impostare lo stile non dovrebbe funzionare.

@Override 
public void onCreate(Bundle savedInstance){ 
    super.onCreate(savedInstance); 
    setStyle(DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_Translucent); 
} 
1

Coloro che utilizzano AlertDialog costruttore in 'onCreateDialog' invece di 'onCreateView' può assegnare tema come codice seguente. La serie completa di temi può essere trovata da R.style. Non dimenticare che alcuni di questi sono supportati di recente e non sono disponibili sui vecchi telefoni cellulari.

@Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), android.R.style.Theme_Translucent); 
     View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_album, null); 
     builder.setView(view); 

     return builder.create(); 
    } 
24

volevo uno sfondo trasparente per il mio DialogFragment, e, nel codice, questo funziona bene:

@Override 
public void onStart() { 
    super.onStart(); 

    Window window = getDialog().getWindow(); 
    window.setBackgroundDrawableResource(android.R.color.transparent); 
} 

Naturalmente, è possibile specificare qualsiasi colore o Drawable utilizzando setBackgroundDrawable() o setBackgroundDrawableResource().

questo funziona almeno in onStart(), ma non in onCreate(), e non necessariamente in onCreateView(), it seems.

Detto questo, nella maggior parte dei casi è probabilmente più pulito per fare questo in XML, using styles, lungo queste linee:

<style name="MyDialogStyle" parent="@android:style/Theme.Holo.Light.Dialog"> 
    <item name="android:windowBackground">@android:color/transparent</item> 
</style> 
+0

Ha funzionato per me, Ragazzi, questo è il trucco, grazie amico, ho risparmiato le mie ore. –

9

Per ottenere una finestra completamente trasparente, è possibile impostare nel onCreateView seguente

  • setBackgroundDrawable a Color.TRANSPARENT
  • setDimAmount a 0

Vedere l'esempio di codice qui:

public class TextEditor extends DialogFragment { 

    public TextEditor() { 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.fragment_text_editor, container); 

     // make dialog itself transparent 
     getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 

     // remove background dim 
     getDialog().getWindow().setDimAmount(0); 

     //[add more custom code here...] 

     return view; 
    } 
} 
0

La risposta di Jul era quasi buona per me. Ma sembra che non funzioni quando si usa un AlertDialog.Builder.

ho dovuto impostare lo stile qui:

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 

    // Use the Builder class for convenient dialog construction 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.MyDialog);