Jak utworzyć DialogFragment bez tytułu?

358

Tworzę DialogFragment, aby wyświetlać komunikaty pomocy dotyczące mojej aplikacji. Wszystko działa dobrze oprócz jednej rzeczy: czarny pasek w górnej części okna pokazuje DialogFragment, który, jak zakładam, jest zarezerwowany dla tytułu, czego nie chcę używać.

Jest to szczególnie bolesne, ponieważ mój niestandardowy DialogFragment wykorzystuje białe tło, więc zmiana jest zbyt głośna, aby można ją było pominąć.

Pokażę to w bardziej graficzny sposób:

wprowadź opis zdjęcia tutaj

Teraz kod XML mojego DialogFragment jest następujący:

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

I kod klasy, która implementuje 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;
    }

}

I proces tworzenia w głównym działaniu:

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

Naprawdę nie wiem, czy ta odpowiedź, związana z oknem dialogowym, pasuje tutaj także do Androida: jak utworzyć okno dialogowe bez tytułu?

Jak mogę pozbyć się tego tytułu?

AlejandroVK
źródło
ta metoda showHelpDialog jest wywoływana z klasy FragmentActivity lub Activity ??
Sjk
80
+1 ... Myślę, że po raz pierwszy się roześmiałem czytając pytanie lol
Jason Crosby
1
+1 za poczucie humoru. Twoje graficzne wyjaśnienie problemu było dokładnie tym, co czułem na temat tego problemu!
Luis Artola,

Odpowiedzi:

589

Po prostu dodaj ten wiersz kodu do swojego HelpDialog.onCreateView(...)

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

W ten sposób wyraźnie prosisz o okno bez tytułu :)


EDYTOWAĆ

Jak @DataGrahami @Blundellwskazał na komentarzach poniżej, to bezpieczniej jest dodać wniosek o oknie tytułowym mniej w onCreateDialog()metodzie zamiast onCreateView(). W ten sposób możesz zapobiec narzucaniu NPE, gdy nie używasz swojego fragmentu jako 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
źródło
61
Oczywiście możesz również skorzystać z metody wygodnej getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE)...
a.bertucci,
8
Zamiast tego możesz to zrobić w pliku onCreateDialog, na wypadek gdyby Twój fragment nie był wyświetlany jako okno dialogowe.
DataGraham,
2
@ a.bertucci jesteś najlepszy! Jeśli jednak dodasz ten fragment jako normalny Fragment getDialog, otrzymasz NPE
Blundell,
4
To zmniejsza szerokość mojego okna dialogowego. Jakieś obejścia tego problemu?
kowal
2
@clocksmith to android:layout_widthatrybut widoku głównego w układzie dla twojego okna dialogowego ustawiony na wrap_content?
ataulm
78

Fragment okna dialogowego ma metodę setStyle, którą należy wywołać przed utworzeniem widoku Java Doc . Również styl okna dialogowego można ustawić tą samą metodą

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
źródło
3
Max, próbowałem użyć setStype (STYLE_NO_TITLE, 0). Ale wynik jest taki, że moje okno dialogowe jest przycięte do 1/4 szerokości, więc komunikat w oknie dialogowym nie jest wyświetlany wszystkie.
vliux
1
Myślę, że dwa sposoby są w rzeczywistości takie same w kodzie, od patrzenia na źródła Androida. Mam ten sam problem, gdy zmniejsza się również do 1/4 rozmiaru :(. Jeszcze go nie rozwiązałem.
abhishekmukherg
1
To najlepszy sposób, aby to zrobić.
Psypher
1
@Sam Masz rację, styl okna jest zachowywany w onSaveInstanceState, a następnie przywracany. Nadal uważam, że lepszą praktyką jest inicjowanie wszystkiego ogólnie w onCreate ().
BladeCoder,
1
Wszystkie bezpośrednie elementy potomne widoku głównego układu muszą mieć szerokość match_parant. Następnie pojawi się okno dialogowe o normalnej szerokości.
nicolaus:
22
FragmentManager manager = getSupportFragmentManager();
SettingsDialog sd = new SettingsDialog();
sd.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
sd.show(manager, "settings_dialog");
Mosiur
źródło
1
sd.setStyle (DialogFragment.STYLE_NORMAL, android.R.style.Theme_Holo_Dialog_NoActionBar) Powiedziałbym
Androider
OMG po tylu próbach, to jedyny działający element.
Alex
16

Wypróbuj łatwy sposób

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NO_TITLE, 0);
}
sonida
źródło
Działa dobrze na 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
źródło
10

Ustaw styl na Theme_Holo_Dialog_NoActionBar:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NORMAL, android.R.style.Theme_Holo_Dialog_NoActionBar);
}
użytkownik2910855
źródło