Come creare un DialogFragment senza titolo?


358

Sto creando un DialogFragment per mostrare alcuni messaggi di aiuto relativi alla mia app. Tutto funziona bene oltre a una cosa: c'è una striscia nera nella parte superiore della finestra che mostra il DialogFragment, che presumo sia riservato per il titolo, qualcosa che non voglio usare.

Questo è particolarmente doloroso poiché il mio DialogFragment personalizzato utilizza uno sfondo bianco, quindi il cambiamento è troppo noto per essere lasciato da parte.

Lascia che ti mostri questo in un modo più grafico:

inserisci qui la descrizione dell'immagine

Ora il codice XML per il mio DialogFragment è il seguente:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <LinearLayout
        android:id="@+id/holding" 
        android:orientation="vertical" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"
        android:background="@drawable/dialog_fragment_bg"
        >
        <!-- Usamos un LinearLayout para que la imagen y el texto esten bien alineados -->
        <LinearLayout
            android:id="@+id/confirmationToast" 
            android:orientation="horizontal" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            >

            <TextView android:id="@+id/confirmationToastText" 
            android:layout_width="wrap_content"
            android:layout_height="fill_parent" 
            android:text="@string/help_dialog_fragment"
            android:textColor="#AE0000"
            android:gravity="center_vertical"
            />

        </LinearLayout>
        <LinearLayout
            android:id="@+id/confirmationButtonLL" 
            android:orientation="horizontal" 
            android:layout_width="fill_parent" 
            android:layout_height="fill_parent"
            android:gravity="center_horizontal"
            >    
            <Button android:id="@+id/confirmationDialogButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:layout_marginBottom="60dp"
                android:background="@drawable/ok_button">
            </Button>
        </LinearLayout>
    </LinearLayout>
</ScrollView>

E il codice della classe che implementa DialogFragment:

public class HelpDialog extends DialogFragment {

    public HelpDialog() {
        // Empty constructor required for DialogFragment
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        //Inflate the XML view for the help dialog fragment
        View view = inflater.inflate(R.layout.help_dialog_fragment, container);
        TextView text = (TextView)view.findViewById(R.id.confirmationToastText);
        text.setText(Html.fromHtml(getString(R.string.help_dialog_fragment)));
        //get the OK button and add a Listener
        ((Button) view.findViewById(R.id.confirmationDialogButton)).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                 // When button is clicked, call up to owning activity.
                HelpDialog.this.dismiss();
             }
         });
        return view;
    }

}

E il processo di creazione nell'attività principale:

/**
 * Shows the HelpDialog Fragment
 */
private void showHelpDialog() {
    android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
    HelpDialog helpDialog = new HelpDialog();
    helpDialog.show(fm, "fragment_help");
}

Non so davvero se questa risposta, correlata a una finestra di dialogo, si adatti anche qui ad Android: come creare una finestra di dialogo senza titolo?

Come posso liberarmi di quest'area del titolo?


questo metodo showHelpDialog viene chiamato dalla classe FragmentActivity o Activity ??
Sjk

80
+1 ... Penso che questa sia la prima volta che ho riso mentre leggevo una domanda lol
Jason Crosby,

1
+1 per il senso dell'umorismo. La tua spiegazione grafica del problema è stata esattamente come mi sono sentito su questo problema!
Luis Artola,

Risposte:


589

Aggiungi questa riga di codice nel tuo HelpDialog.onCreateView(...)

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

In questo modo stai esplicitamente chiedendo di ottenere una finestra senza titolo :)


MODIFICARE

Come @DataGrahame @Blundellaffacciata sui commenti qui sotto, è più sicuro di aggiungere la richiesta di una finestra titolo-less nel onCreateDialog()metodo, invece di onCreateView(). In questo modo puoi evitare di nobilitare NPE quando non stai usando il tuo frammento come Dialog:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
  Dialog dialog = super.onCreateDialog(savedInstanceState);

  // request a window without the title
  dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
  return dialog;
}

61
Ovviamente puoi anche usare il metodo convenienza getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE)...
a.bertucci

8
Può decidere di farlo in onCreateDialog invece, nel caso in cui il frammento è mostrato non come un dialogo.
DataGraham,

2
@ a.bertucci sei il migliore! Tuttavia, se mai aggiungi quel frammento come un normale frammento, getDialogti restituirà un NPE
Blundell,

4
Questo riduce la larghezza della mia finestra di dialogo. Qualche soluzione alternativa per questo problema?
fabbro

2
@clocksmith è l' android:layout_widthattributo per la vista radice nel layout per la finestra di dialogo impostata su wrap_content?
ataulm,

78

Il frammento della finestra di dialogo ha il metodo setStyle, che dovrebbe essere chiamato prima della creazione della vista Java Doc . Anche lo stile della finestra di dialogo può essere impostato con lo stesso metodo

public static MyDialogFragment newInstance() {
        MyDialogFragment mDialogFragment = new MyDialogFragment();
        //Set Arguments here if needed for dialog auto recreation on screen rotation
        mDialogFragment.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
        return mDialogFragment;
}

3
Max, ho provato a usare setStype (STYLE_NO_TITLE, 0). Ma il risultato è che la mia finestra di dialogo è tagliata a 1/4 della larghezza, quindi il messaggio nella finestra di dialogo non viene mostrato tutto.
vliux,

1
Penso che i due modi siano effettivamente gli stessi nel codice, osservando le fonti Android. Sto riscontrando lo stesso problema anche se sta tagliando in 1/4 delle dimensioni :(. Non l'ho ancora risolto.
abhishekmukherg

1
Questo è il modo migliore per farlo.
Psypher,

1
@Sam Hai ragione, lo stile Window è persistito in onSaveInstanceState e ripristinato in seguito. Credo ancora che sia una buona pratica inizializzare tutto in onCreate () in generale.
BladeCoder

1
Tutti i figli diretti di una vista radice del tuo layout devono avere una larghezza di match_parant. Quindi otterrai una finestra di dialogo con una larghezza normale.
nicolaus Sì

22
FragmentManager manager = getSupportFragmentManager();
SettingsDialog sd = new SettingsDialog();
sd.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
sd.show(manager, "settings_dialog");

1
sd.setStyle (DialogFragment.STYLE_NORMAL, android.R.style.Theme_Holo_Dialog_NoActionBar) Direi
Androider,

OMG dopo così tante prove, questo è l'unico pezzo che ha funzionato.
Alex,

16

Prova in modo semplice

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NO_TITLE, 0);
}

Funziona bene su Samsung Galaxy S4.
CoolMind,

11
public class LoginDialog extends DialogFragment {   
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.login_dialog, null);
        getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        return view;
    }   
}

10

Imposta lo stile su Theme_Holo_Dialog_NoActionBar:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NORMAL, android.R.style.Theme_Holo_Dialog_NoActionBar);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.