Bagaimana cara membuat DialogFragment tanpa judul?

358

Saya membuat DialogFragment untuk menampilkan beberapa pesan bantuan terkait aplikasi saya. Semuanya berfungsi dengan baik selain satu hal: Ada garis hitam di bagian atas jendela yang menunjukkan DialogFragment, yang saya anggap disediakan untuk judul, sesuatu yang tidak ingin saya gunakan.

Ini sangat menyakitkan karena DialogFragment kebiasaan saya menggunakan latar belakang putih, jadi perubahannya terlalu terkenal untuk dikesampingkan.

Mari saya tunjukkan ini dengan cara yang lebih grafis:

masukkan deskripsi gambar di sini

Sekarang kode XML untuk DialogFragment saya adalah sebagai berikut:

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

Dan kode kelas yang mengimplementasikan 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;
    }

}

Dan proses pembuatan dalam Kegiatan utama:

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

Saya benar-benar tidak tahu apakah jawaban ini, terkait dengan Dialog, cocok untuk Android juga : Bagaimana cara membuat Dialog tanpa judul?

Bagaimana saya bisa menyingkirkan area judul ini?

AlejandroVK
sumber
Metode showHelpDialog ini dipanggil dari kelas FragmentActivity atau Activity ??
Sjk
80
+1 ... Saya pikir ini adalah pertama kalinya saya tertawa ketika membaca pertanyaan lol
Jason Crosby
1
+1 untuk selera humor. Penjelasan grafis Anda tentang masalahnya persis seperti yang saya rasakan tentang masalah ini!
Luis Artola

Jawaban:

589

Cukup tambahkan baris kode ini di HelpDialog.onCreateView(...)

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

Dengan cara ini Anda secara eksplisit meminta untuk mendapatkan jendela tanpa judul :)


EDIT

Seperti @DataGrahamdan @Blundellditunjukkan pada komentar di bawah, lebih aman untuk menambahkan permintaan untuk jendela tanpa judul dalam onCreateDialog()metode onCreateView(). Dengan cara ini Anda dapat mencegah ennoying NPE saat Anda tidak menggunakan fragmen Anda sebagai 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
sumber
61
Tentu saja Anda juga dapat menggunakan metode kenyamanan getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE)juga ...
a.bertucci
8
Mungkin ingin melakukan ini di onCreateDialog sebagai gantinya, jika fragmen Anda ditampilkan bukan sebagai dialog.
DataGraham
2
@ a.bertucci kaulah yang terbaik! Namun jika Anda pernah menambahkan fragmen itu sebagai fragmen normal, Anda getDialogakan dikembalikan NPE
Blundell
4
Ini menyusutkan lebar dialog saya. Adakah solusi untuk masalah ini?
tukang kunci
2
@clocksmith adalah android:layout_widthatribut untuk tampilan root di tata letak untuk dialog Anda diatur ke wrap_content?
ataulm
78

Fragmen dialog memiliki metode setStyle, yang harus dipanggil sebelum melihat pembuatan Java Doc . Gaya dialog juga dapat diatur dengan metode yang sama

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
sumber
3
Max, saya mencoba menggunakan setStype (STYLE_NO_TITLE, 0). Tetapi hasilnya adalah dialog saya dipotong menjadi 1/4 ukuran lebar, sehingga pesan dalam dialog tidak ditampilkan semua.
vliux
1
Saya pikir dua cara ini sebenarnya sama dalam kode, dari melihat sumber android. Saya mengalami masalah yang sama di mana ia memotong menjadi 1/4 ukuran juga :(. Belum menyelesaikannya.
abhishekmukherg
1
Ini adalah cara terbaik untuk melakukannya.
Psypher
1
@ Sam Anda benar, gaya Window tetap ada di onSaveInstanceState dan dipulihkan setelahnya. Saya masih percaya ini adalah praktik yang lebih baik untuk menginisialisasi segala sesuatu di onCreate () secara umum.
BladeCoder
1
Semua anak langsung dari tampilan root tata letak Anda harus lebar match_parant. Maka Anda akan mendapatkan dialog dengan lebar normal.
nicolausYa
22
FragmentManager manager = getSupportFragmentManager();
SettingsDialog sd = new SettingsDialog();
sd.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
sd.show(manager, "settings_dialog");
Mosia
sumber
1
sd.setStyle (DialogFragment.STYLE_NORMAL, android.R.style.Theme_Holo_Dialog_NoActionBar) Saya akan mengatakan
Androider
OMG setelah begitu banyak percobaan, ini adalah satu-satunya karya yang berhasil.
Alex
16

Coba dengan cara mudah

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NO_TITLE, 0);
}
sonida
sumber
Berfungsi dengan baik pada 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
sumber
10

Setel gaya ke Theme_Holo_Dialog_NoActionBar:

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