Android: Cara membuat Dialog tanpa judul?

269

Saya mencoba membuat dialog khusus di Android. Saya membuat Dialog saya seperti ini:

dialog = new Dialog(this);
dialog.setContentView(R.layout.my_dialog);

Semuanya berfungsi dengan baik kecuali untuk judul Dialog. Bahkan jika saya tidak menetapkan judul dialog, dialog popup memiliki ruang kosong di posisi dialog.

Apakah ada cara untuk menyembunyikan bagian Dialog ini?

Saya mencobanya dengan AlertDialog tetapi sepertinya tata letak tidak diatur dengan benar:

LayoutInflater inflater = 
    (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.map_dialog, null);

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(view);

// dialog = new Dialog(this);
// dialog.setContentView(R.layout.map_dialog);

dialog = builder.create();

((TextView) dialog.findViewById(R.id.nr)).setText(number);

Jika saya menggunakan kode ini saya mendapatkan Pengecualian Pointer nol di baris terakhir. Dialognya tidak nol sehingga TextView yang saya coba ambil tidak ada.
Jika saya batalkan komentar pada bagian di mana saya menggunakan Dialog Constructor semuanya berfungsi dengan baik tetapi untuk judul di atas tata letak dialog saya.

Janusz
sumber
7
@ Janusz memilih jawaban Anda untuk stackoverflow.com/a/3407871/632951
Pacerier
coba stackoverflow.com/questions/6263639/... alih-alih jawaban sebelumnya ... jawaban sederhana
Mohammed mansoor
Hanya saja, jangan panggil AlertDialog.Builder.setTitle () dan dialog Anda akan muncul tanpa judul.
marvatron

Jawaban:

208

Anda dapat menyembunyikan judul dialog menggunakan:

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);


Versi sebelumnya dari jawaban ini, yang terlalu rumit:

Anda harus menggunakan AlertDialog. Ada penjelasan yang bagus di situs Pengembang Android tentang dialog khusus .

Dalam ringkasan yang sangat singkat, Anda melakukan ini dengan kode seperti disalin di bawah ini dari situs web resmi. Itu membutuhkan file layot ​​khusus, mengembang, memberinya beberapa teks dan ikon dasar, lalu membuatnya. Anda akan menunjukkannya dengan alertDialog.show().

AlertDialog.Builder builder;
AlertDialog alertDialog;

Context mContext = getApplicationContext();
LayoutInflater inflater = (LayoutInflater)
        mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.custom_dialog,
        (ViewGroup) findViewById(R.id.layout_root));

TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("Hello, this is a custom dialog!");
ImageView image = (ImageView) layout.findViewById(R.id.image);
image.setImageResource(R.drawable.android);

builder = new AlertDialog.Builder(mContext);
builder.setView(layout);
alertDialog = builder.create();

Menanggapi komentar:

Saya berasumsi bahwa TextView dengan id nrada di tampilan yang Anda gembungkan View view = inflater..... Jika demikian, maka Anda perlu mengubah sedikit saja: alih-alih dialog.findView...membuatnya view.findView.... Kemudian setelah Anda selesai melakukannya, ingatlah untuk menggunakan dialog.show (), atau bahkan builder.show () tanpa repot-repot melakukan builder.create ().

Steve Haley
sumber
4
Saya pikir Anda mungkin salah membaca Pertanyaan? Janusz sudah menampilkan dialog khusus dan hanya memerlukan informasi tentang cara menghapus judul
Donal Rafferty
17
Nah, menurut dokumentasi resmi, "Dialog yang dibuat dengan kelas Dialog dasar harus memiliki judul. Jika Anda tidak memanggil setTitle (), maka ruang yang digunakan untuk judul tetap kosong, tetapi masih terlihat. Jika Anda tidak "Saya tidak ingin judul sama sekali, maka Anda harus membuat dialog khusus menggunakan kelas AlertDialog." Saya belum bereksperimen secara pribadi dengan itu, tetapi itu akan menunjukkan bahwa bahkan menggunakan tata letak dialog kustom atau tema, tidak mungkin untuk menghapus ruang judul.
Steve Haley
2
Pikiran kedua: Saya pikir kita memahami "judul" secara berbeda. Saya berasumsi dia berbicara tentang ruang di bagian atas jendela pop-up, bukan judul di bagian atas aplikasi.
Steve Haley
11
@SteveHaley, Tidak mungkin menyembunyikannya menggunakan baris berikutdialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
Sami Eltamawy
1
Pastikan Anda melakukan dialog.requestWindowFeature (Window.FEATURE_NO_TITLE); SEBELUM Anda mengembang tampilan dialog Anda.
Alexey Podlasov
585

FEATURE_NO_TITLE berfungsi saat membuat dialog dari awal, seperti pada:

Dialog dialog = new Dialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

Tapi itu tidak berfungsi ketika membuat AlertDialog (atau menggunakan Builder), karena sudah menonaktifkan judul dan menggunakan yang kustom secara internal.

Saya telah melihat sumber-sumber SDK, dan saya pikir itu tidak dapat dikerjakan. Jadi untuk menghapus spasi atas, satu-satunya solusi adalah membuat dialog khusus dari awal IMO, dengan menggunakan kelas Dialog secara langsung.

Selain itu, orang dapat melakukannya dengan suatu gaya, misalnya dalam styles.xml:

<style name="FullHeightDialog" parent="android:style/Theme.Dialog">
   <item name="android:windowNoTitle">true</item>
</style>

Lalu:

Dialog dialog = new Dialog(context, R.style.FullHeightDialog);
olivierg
sumber
Alih-alih membuat dialog khusus dari awal, saya membuat styles.xml seperti yang disarankan oleh oliverg. Dan kemudian, saya menambahkan android: theme = "@ style / FullHeightDialog" ke deklarasi <activity> ... </acitivity> dalam file Manifest. Itu hanya berhasil. Terima kasih ..
Indrajeet
@olivierg tapi saya ingin tombol dengan dialog tinggi penuh. apa solusinya?
Pacerier
1
Perhatikan permintaan barisWindowFeature harus SEBELUM garis setContentView.
Fattie
Meskipun ini menjawab komentar aktual terbaik, solusi dalam jawaban yang diterima adalah yang terbaik menurut saya. Saya mulai melakukannya seperti ini, dengan bersih Dialog, tetapi membuat AlertDialogitu jauh lebih mudah. Seperti yang dinyatakan dalam dokumen : The Dialog class is the base class for dialogs, but you should avoid instantiating Dialog directly. Instead, use one of the following subclasses: <AlertDialog and others described here>. The AlertDialogjuga menangani hal-hal siklus hidup dan ok / membatalkan dalam sopan santun mudah.
Krøllebølle
67

Dalam kode Anda, tambahkan baris ini

requestWindowFeature(Window.FEATURE_NO_TITLE);  

Atau dalam XML gunakan tema

android:theme="@android:style/Theme.NoTitleBar"

XML akan menjadi implementasi yang lebih baik karena dengan versi kode bilah judul dibuat dan kemudian dihapus yang merupakan pemborosan sumber daya

Ok coba bagus tapi tidak berhasil. Saya mendapatkan: android.view.WindowManager $ BadTokenException: Tidak dapat menambahkan jendela - token null bukan untuk aplikasi jika saya ingin menutup dialog.

Ubah jenis dialog lansiran ke dialog sistem (mis., TYPE_SYSTEM_OVERLAY) dan lihat apakah ini menyelesaikan masalah Anda

Donal Rafferty
sumber
2
Jangan panggil setContentView () sebelum requestFeature ().
jlopez
61

Gunakan seperti ini:

Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 

Ini akan menghapus bilah judul apa pun dari jendela dialog.

alok tiwari
sumber
3
Jangan panggil setContentView () sebelum requestFeature ().
jlopez
2
Bagaimana saya membawanya kembali nanti?
pengembang android
58

Gunakan kode di bawah ini sebelum setcontentview: -

    Dialog dialog = new Dialog(this);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    dialog.setContentView(R.layout.custom_dialog);

Catatan : Anda harus memiliki kode di atas, dalam urutan dan baris yang sama. requestWindowFeatureharus sebelum baris setContentView.

Duggu
sumber
Saat menggunakan dalam Dialogfragment, solusi ini berfungsi lebih baik bagi saya karena jawaban yang diterima menciptakan celah vertikal kecil antara bingkai dialog dan tampilan konten dalam.
Sebastian Roth
38

Anda dapat menghapus judul dengan

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

di mana dialog adalah nama dialog saya.

shailendra
sumber
Jangan panggil setContentView () sebelum requestFeature ()
jlopez
29

Dalam kode Anda jika Anda menggunakan requestWindowFeature(Window.FEATURE_NO_TITLE); pastikan bahwa itu berjalan sebelum dialog.setContentView();kalau tidak menyebabkan aplikasi crash.

Szymon Morawski
sumber
agak ragu untuk mencoba sebelumnya dan cukup terkejut bahwa itu jelas berhasil. sejak di android.developer.com mereka mengatakan dengan jelas bahwa itu adalah suatu keharusan untuk dialog khusus untuk memiliki judul. : P
richardlin
10

Saya menemukan Tiga Cara untuk melakukan ini>

1) Menggunakan requestWindowFeature

Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(dialog.getWindow().FEATURE_NO_TITLE); 

2) Menggunakan style (style.xml)

<style name="FullHeightDialog" parent="android:style/Theme.Dialog">
   <item name="android:windowNoTitle">true</item>
</style>

Dialog dialog = new Dialog(context, R.style.FullHeightDialog);

3) Menggunakan tema XML di AndroidManifest.xml

 android:theme="@android:style/Theme.NoTitleBar"
Nirav Ranpara
sumber
1
Metode pertama adalah dialog.requestWindowFeature (Window.FEATURE_NO_TITLE);
Jon Willis
10

Di kelas Custom_Dialog.java Anda tambahkan requestWindowFeature(Window.FEATURE_NO_TITLE)

public class Custom_Dialog extends Dialog {

    protected Custom_Dialog(Context context, int theme) {
        super(context, theme);
        // TODO Auto-generated constructor stub
        requestWindowFeature(Window.FEATURE_NO_TITLE); //This line 
    }
}
M_K
sumber
Ini adalah satu-satunya hal yang berhasil untuk saya ... untuk beberapa alasan semua saran lainnya tidak berfungsi. Satu-satunya hal yang akan saya rekomendasikan adalah membuat konstruktor untuk umum dan juga untuk menyediakan konstruktor Dialog lain yang hanya membutuhkan Konteks
Justin
7

Jawaban olivierg bekerja untuk saya dan merupakan solusi terbaik jika membuat kelas Dialog khusus adalah rute yang ingin Anda tuju. Namun, itu mengganggu saya bahwa saya tidak bisa menggunakan kelas AlertDialog. Saya ingin dapat menggunakan sistem gaya AlertDialog standar. Membuat kelas dialog khusus tidak akan memiliki gaya ini.

Jadi saya menemukan solusi (retas) yang akan berfungsi tanpa harus membuat kelas khusus, Anda dapat menggunakan pembangun yang ada.

AlertDialog menempatkan Tampilan di atas tampilan konten Anda sebagai pengganti untuk judul tersebut. Jika Anda menemukan tampilan dan mengatur ketinggian ke 0, ruang hilang.

Saya telah menguji ini pada 2.3 dan 3.0 sejauh ini, mungkin masih belum berfungsi pada setiap versi.

Berikut adalah dua metode pembantu untuk melakukannya:

/**
 * Show a Dialog with the extra title/top padding collapsed.
 * 
 * @param customView The custom view that you added to the dialog
 * @param dialog The dialog to display without top spacing
     * @param show Whether or not to call dialog.show() at the end.
 */
public static void showDialogWithNoTopSpace(final View customView, final Dialog dialog, boolean show) {
    // Now we setup a listener to detect as soon as the dialog has shown.
    customView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

        @Override
        public void onGlobalLayout() {
            // Check if your view has been laid out yet
            if (customView.getHeight() > 0) {
                // If it has been, we will search the view hierarchy for the view that is responsible for the extra space. 
                LinearLayout dialogLayout = findDialogLinearLayout(customView);
                if (dialogLayout == null) {
                    // Could find it. Unexpected.

                } else {
                    // Found it, now remove the height of the title area
                    View child = dialogLayout.getChildAt(0);
                    if (child != customView) {
                        // remove height
                        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) child.getLayoutParams();
                        lp.height = 0;
                        child.setLayoutParams(lp);

                    } else {
                        // Could find it. Unexpected.
                    }
                }

                // Done with the listener
                customView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            }
         }

    });

    // Show the dialog
    if (show)
             dialog.show();
}

/**
 * Searches parents for a LinearLayout
 * 
 * @param view to search the search from
 * @return the first parent view that is a LinearLayout or null if none was found
 */
public static LinearLayout findDialogLinearLayout(View view) {
    ViewParent parent = (ViewParent) view.getParent();
    if (parent != null) {
        if (parent instanceof LinearLayout) {
            // Found it
            return (LinearLayout) parent;

        } else if (parent instanceof View) {
            // Keep looking
            return findDialogLinearLayout((View) parent);

        }
    }

    // Couldn't find it
    return null;
}

Berikut adalah contoh penggunaannya:

    Dialog dialog = new AlertDialog.Builder(this)
        .setView(yourCustomView)
        .create();

    showDialogWithNoTopSpace(yourCustomView, dialog, true);

Jika Anda menggunakan ini dengan DialogFragment, ganti onCreateDialogmetode DialogFragment . Kemudian buat dan kembalikan dialog Anda seperti contoh pertama di atas. Satu-satunya perubahan adalah Anda harus memberikan false sebagai parameter ke-3 (show) sehingga tidak memanggil show () pada dialog. DialogFragment akan menanganinya nanti.

Contoh:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = new AlertDialog.Builder(getContext())
        .setView(yourCustomView)
        .create();

    showDialogWithNoTopSpace(yourCustomView, dialog, false);
    return dialog;
}

Saat saya menguji ini lebih lanjut, saya pasti akan memperbarui dengan tweak tambahan yang diperlukan.

cottonBallPaws
sumber
Solusi elegan, +1. Apakah Anda tahu cara menggunakan ini di DialogFragment?
Binoy Babu
@Binoy memperbarui jawaban untuk DialogFragments (itulah sebenarnya cara saya menggunakannya)
cottonBallPaws
6

Saya tidak tahu apakah pertanyaan ini masih aktual, tetapi dalam kasus saya, ketika saya beralih dari Dialog ke DialogFragment,

requestWindowFeature(Window.FEATURE_NO_TITLE);

bukan pilihan, tapi saya bisa menggunakan

setStyle(STYLE_NO_TITLE, 0);

alih-alih dengan hasil yang sama.

Analisis
sumber
Untuk memperjelas, baris ini ( setStyle(STYLE_NO_TITLE, 0);) akan masuk pada metode onCreate dari kelas DialogFragment Anda.
Harga
4

Setel judul menjadi string kosong menggunakan pembangun.

    Builder builder = new AlertDialog.Builder(context);
    builder.setTitle("");
...
    builder.show();
Szere Dyeri
sumber
3

atur atribut "gravity" pada seluruh dialog menjadi "center". Maka Anda perlu menimpa pengaturan itu untuk semua komponen anak dalam dialog yang Anda tidak ingin terpusat.

Mat
sumber
3
dialog=new Dialog(YourActivity.this, 1);  // to make dialog box full screen with out title.
dialog.setContentView(layoutReference);
dialog.setContentView(R.layout.layoutexample);
Bamadeva
sumber
3

dalam XML menggunakan tema

android:theme="@android:style/Theme.NoTitleBar"
Asad Rao
sumber
3

Jika kita cukup menggunakan dialog tanpa setTitle(), lalu apakah itu akan berhasil menghilangkan ruang judul?

mUSSDDialog = new AlertDialog.Builder(context).setView(dialogView)
.setPositiveButton(R.string.send_button,DialogListener)
.setNegativeButton(R.string.cancel,DialogListener)
.setCancelable(false).create();
jad
sumber
3

Pikirkan Anda bisa menggunakan ini sekarang:

AlertDialog dialog = new AlertDialog.Builder(this)
  .setView(view)
  .setTitle("")
  .create()
J2K
sumber
2
ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "", 
                             "Loading. Please wait...", true);

membuat dialog tanpa judul

Praveen Kondapalli
sumber
2
public static AlertDialog showAlertDialogWithoutTitle(Context context,String msg) 
     {
      AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
      alertDialogBuilder.setMessage(msg).setCancelable(false)
        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialog, int id) {

         }
        });

       return alertDialogBuilder.create(); 
     }
Sandeep Kumar Patil
sumber
2

Saat menggunakan AlertDialog, tidak menggunakan setTitle()membuat judulnya hilang

kostikus
sumber
1

Setelah melakukan peretasan, saya berhasil:

            Window window = dialog.getWindow();
            View view = window.getDecorView();
            final int topPanelId = getResources().getIdentifier( "topPanel", "id", "android" );
            LinearLayout topPanel = (LinearLayout) view.findViewById(topPanelId);
            topPanel.setVisibility(View.GONE);
Chuck D
sumber
apa yang ada dialogdi sini dangetResources()
Kartheek s
1

Anda dapat melakukan ini tanpa menggunakan AlertDialogdengan mendefinisikan Kelas baru yang memanjang dari DialogKelas seperti ini:

public class myDialog extends Dialog {
    public myDialog(Context context) {
        super(context);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
    }
}
Khaled AbuShqear
sumber
1

Berikut ini sesuatu yang dapat Anda lakukan AlertBuilderuntuk menghilangkan judul:

TextView title = new TextView(this);
title.setVisibility(View.GONE);
builder.setCustomTitle(title);
rundavidrun
sumber
1

Gunakan ini

    Dialog dialog = new Dialog(getActivity());
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    dialog.setCancelable(true);
    dialog.setContentView(R.layout.image_show_dialog_layout);
Habibur Rahman Ovie
sumber
0

dialog_custom .requestWindowFeature (Window.FEATURE_NO_TITLE);

ini akan menghapus judul dari dialog cutsom.

Catatan tambahkan baris ini sebelum menambahkan konten .. misalnya

     dialog_custom = Dialog(activity!!)
    dialog_custom.requestWindowFeature(Window.FEATURE_NO_TITLE)
    dialog_custom.setContentView(R.layout.select_vehicle_type)
    dialog_custom.setCanceledOnTouchOutside(false)
    dialog_custom.setCancelable(true)
indrajeet jyoti
sumber