Wie erstelle ich ein DialogFragment ohne Titel?

358

Ich erstelle ein DialogFragment, um einige Hilfemeldungen zu meiner App anzuzeigen. Abgesehen von einer Sache funktioniert alles einwandfrei: Oben im Fenster befindet sich ein schwarzer Streifen, der das DialogFragment anzeigt, von dem ich annehme, dass es für den Titel reserviert ist, etwas, das ich nicht verwenden möchte.

Dies ist besonders schmerzhaft, da mein benutzerdefiniertes DialogFragment einen weißen Hintergrund verwendet, sodass die Änderung viel zu berüchtigt ist, um sie außer Acht zu lassen.

Lassen Sie mich dies grafischer zeigen:

Geben Sie hier die Bildbeschreibung ein

Der XML-Code für mein DialogFragment lautet nun wie folgt:

<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>

Und der Code der Klasse, die das DialogFragment implementiert:

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;
    }

}

Und der Erstellungsprozess in der Hauptaktivität:

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

Ich weiß wirklich nicht, ob diese Antwort, die mit einem Dialog zusammenhängt, auch hier zu Android passt : Wie erstelle ich einen Dialog ohne Titel?

Wie kann ich diesen Titelbereich entfernen?

AlejandroVK
quelle
Diese showHelpDialog-Methode wird von der FragmentActivity- oder Activity-Klasse aufgerufen.
Sjk
80
+1 ... Ich denke, dies ist das erste Mal, dass ich beim Lesen einer Frage lachte lol
Jason Crosby
1
+1 für Sinn für Humor. Ihre grafische Erklärung des Problems war genau so, wie ich mich zu diesem Problem fühlte!
Luis Artola

Antworten:

589

Fügen Sie einfach diese Codezeile in Ihre HelpDialog.onCreateView(...)

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

Auf diese Weise möchten Sie ausdrücklich ein Fenster ohne Titel erhalten :)


BEARBEITEN

Wie @DataGrahamund @Blundellunten auf den Kommentaren darauf hingewiesen, ist es sicherer , den Antrag für einen Titel losen Fenster in der hinzuzufügen onCreateDialog()Verfahren statt onCreateView(). Auf diese Weise können Sie verhindern, dass NPE nervt, wenn Sie Ihr Fragment nicht als 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;
}
a.bertucci
quelle
61
Natürlich können Sie auch die Convenience-Methode verwenden getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE)...
a.bertucci
8
Möglicherweise möchten Sie dies stattdessen in onCreateDialog tun, falls Ihr Fragment nicht als Dialogfeld angezeigt wird .
DataGraham
2
@ a.bertucci du bist der beste! Wenn Sie dieses Fragment jedoch jemals als normales Fragment hinzufügen, erhalten getDialogSie
Blundell
4
Dies verkleinert die Breite meines Dialogs. Gibt es Problemumgehungen für dieses Problem?
Uhrmacher
2
@clocksmith ist das android:layout_widthAttribut für die Stammansicht im Layout für Ihren Dialog auf wrap_content?
Ataulm
78

Das Dialogfragment verfügt über die setStyle-Methode, die vor der Erstellung der Ansicht in Java Doc aufgerufen werden sollte . Mit der gleichen Methode kann auch der Stil des Dialogs festgelegt werden

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;
}
Max Ch
quelle
3
Max, ich habe versucht, setStype (STYLE_NO_TITLE, 0) zu verwenden. Das Ergebnis ist jedoch, dass mein Dialogfeld auf 1/4 der Breite zugeschnitten ist, sodass die Meldung im Dialogfeld nicht alle angezeigt wird.
Vliux
1
Ich denke, die beiden Möglichkeiten sind im Code tatsächlich gleich, wenn man sich die Android-Quellen ansieht. Ich habe das gleiche Problem, wo es auch in 1/4 der Größe schneidet :(. Habe es noch nicht gelöst.
abhishekmukherg
1
Dies ist der beste Weg, dies zu tun.
Psypher
1
@Sam Sie haben Recht, der Window-Stil wird in onSaveInstanceState beibehalten und anschließend wiederhergestellt. Ich glaube immer noch, dass es besser ist, alles in onCreate () im Allgemeinen zu initialisieren.
BladeCoder
1
Alle direkten untergeordneten Elemente einer Stammansicht Ihres Layouts müssen eine Breite von match_parant haben. Dann erhalten Sie einen Dialog mit einer normalen Breite.
nicolausYes
22
FragmentManager manager = getSupportFragmentManager();
SettingsDialog sd = new SettingsDialog();
sd.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
sd.show(manager, "settings_dialog");
Mosiur
quelle
1
sd.setStyle (DialogFragment.STYLE_NORMAL, android.R.style.Theme_Holo_Dialog_NoActionBar) Ich würde sagen
Androider
OMG nach so vielen Versuchen ist dies das einzige Stück, das funktioniert hat.
Alex
16

Versuchen Sie es einfach

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NO_TITLE, 0);
}
Sonida
quelle
Funktioniert gut auf 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;
    }   
}
Zulfiqar
quelle
10

Setzen Sie den Stil auf Theme_Holo_Dialog_NoActionBar:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NORMAL, android.R.style.Theme_Holo_Dialog_NoActionBar);
}
user2910855
quelle