Android: Başlıksız bir Diyalog nasıl oluşturulur?


269

Android'de özel bir iletişim kutusu oluşturmaya çalışıyorum. Diyaloğumu şöyle oluşturuyorum:

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

Diyalog başlığı dışında her şey yolunda gidiyor. İletişim kutusunun başlığını ayarlamasam bile, iletişim kutusu açılır penceresinde iletişim kutusunda boş bir alan vardır.

İletişim Kutusunun bu bölümünü gizlemenin bir yolu var mı?

Bir AlertDialog ile denedim ama düzen düzgün ayarlanmamış gibi görünüyor:

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

Bu kodu kullanırsanız son satırda bir boş Pointer Exception olsun. Almak için çalıştığım TextView mevcut olmadığından iletişim kutusu boş değil.
Dialog Constructor'ı kullandığım bölümü açığa çıkarırsam, her şey iyi çalışır ancak diyalog düzenimin üzerindeki başlık için.



önceki cevap yerine stackoverflow.com/questions/6263639/… deneyin ... basit cevap
Mohammed mansoor

AlertDialog.Builder.setTitle () öğesini çağırmayın; iletişim kutunuz bir başlık olmadan görünür.
marvatron

Yanıtlar:


208

Aşağıdakileri kullanarak bir iletişim kutusunun başlığını gizleyebilirsiniz:

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);


Bu cevabın aşırı karmaşık olan önceki sürümü:

Bir kullanmanız gerekir AlertDialog. Android Geliştiricinin sitesinde özel iletişim kutuları hakkında iyi bir açıklama var .

Çok kısa bir özetle, bunu resmi web sitesinden aşağıda kopyalanan kodla yaparsınız. Bu özel bir layot ​​dosyası alır, şişirir, bazı temel metin ve simge verir, sonra oluşturur. Sonra göstereceksin 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();

Yoruma yanıt olarak:

Id ile TextView nrşişirme görünümde olduğunu varsayalım View view = inflater..... Eğer öyleyse, o zaman sadece bir biti değiştirmeniz gerekir: dialog.findView...yapmak yerine view.findView.... Sonra bunu yaptıktan sonra, builder.create () yapmak için uğraşmadan dialog.show (), hatta builder.show () kullanmayı unutmayın.


4
Soruyu yanlış okumuş olabileceğinizi düşünüyorum? Janusz zaten özel iletişim kutusunu gösteriyor ve sadece başlığı kaldırma hakkında bilgi gerektiriyor
Donal Rafferty

17
Resmi belgelere göre, "Temel iletişim kutusu sınıfıyla yapılan bir iletişim kutusunun bir başlığı olmalıdır. SetTitle () öğesini çağırmazsanız, başlık için kullanılan alan boş kalır, ancak yine de görünür. t bir başlık istemiyorsanız, AlertDialog sınıfını kullanarak özel iletişim kutunuzu oluşturmalısınız. " Kişisel olarak denemedim, ancak bu, özel bir iletişim kutusu düzeni veya temaları bile olsa, başlık alanını kaldırmak imkansız olduğunu düşündürür.
Steve Haley

2
2. düşünce: Bence "başlığı" farklı anlıyoruz. Uygulamanın üstündeki başlıktan değil, pop-up pencerenin üstündeki alandan bahsettiğini varsayıyorum.
Steve Haley

11
@SteveHaley, Hayır Aşağıdaki satırı kullanarak gizlemek mümkün değildialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
Sami Eltamawy

1
Dialog.requestWindowFeature (Window.FEATURE_NO_TITLE) yaptığınızdan emin olun; Diyalog görünümünüzü şişirmeden ÖNCE.
Alexey Podlasov

585

FEATURE_NO_TITLE, sıfırdan bir diyalog oluştururken şu şekilde çalışır:

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

Ancak bir AlertDialog oluştururken (veya Builder'ı kullanırken) çalışmaz, çünkü başlığı zaten devre dışı bırakır ve özel bir dahili kod kullanır.

SDK kaynaklarına baktım ve bunun çözülemeyeceğini düşünüyorum. Bu nedenle, üst boşluğu kaldırmak için tek çözüm, doğrudan Dialog sınıfını kullanarak sıfırdan IMO'dan özel bir iletişim kutusu oluşturmaktır.

Ayrıca, bunu bir stille, örneğin styles.xml'de yapabilirsiniz:

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

Ve sonra:

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

Sıfırdan özel bir iletişim kutusu oluşturmak yerine oliverg tarafından önerildiği gibi styles.xml dosyasını oluşturdum. Ve sonra Manifest dosyasındaki <activity> ... </acitivity> bildirimine android: theme = "@ style / FullHeightDialog" ekledim. Sadece çalıştı. Teşekkürler ..
Indrajeet

@olivierg ama tam boy iletişim kutusu olan bir düğme istiyorum. çözüm nedir?
Pacerier

1
RequestWindowFeature satırının setContentView satırından ÖNCE olması gerektiğini unutmayın .
Fattie

Bu gerçek yorumları en iyi şekilde cevaplasa da, kabul edilen cevaptaki çözüm bence en iyisidir. Temiz bir şekilde böyle yapmaya başladım Dialog, ama bir tane oluşturmak AlertDialogçok daha kolaydı. O da belirtildiği gibi docs : 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>. AlertDialogAyrıca yaşam döngüsü malzeme işleme ve ok / kolay şekillerde iptal edin.
Krøllebølle

67

Kodunuza bu satırı ekleyin

requestWindowFeature(Window.FEATURE_NO_TITLE);  

Veya XML'de bir tema kullanın

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

XML, kod çubuğunda başlık çubuğunun oluşturulduğu ve kaldırıldığı için daha iyi bir uygulama olacaktır, bu da kaynak kaybıdır

Tamam iyi deneyin ama çalışmıyor. Ben alıyorum: android.view.WindowManager $ BadTokenException: Iletişim kutusu shwo istiyorsanız pencere - simge null eklenemiyor bir uygulama için değil.

Uyarı iletişim kutusu türünü sistem iletişim kutusuna değiştirin (örn. TYPE_SYSTEM_OVERLAY) ve bunun sorununuzu çözüp çözmediğine bakın


2
RequestFeature () yönteminden önce setContentView () yöntemini çağırma.
jlopez

61

Bunun gibi kullanın:

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

Bu, herhangi bir başlık çubuğunu iletişim penceresinden kaldıracaktır.


3
RequestFeature () yönteminden önce setContentView () yöntemini çağırma.
jlopez

2
Daha sonra nasıl geri getirebilirim?
android geliştirici

58

Daha önce aşağıdaki kodu kullanın setcontentview: -

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

Not : Yukarıdaki kodun aynı sırada ve sırada olması gerekir. setContentView satırından öncerequestWindowFeature olmalıdır .


Bir İletişim Kutusunda kullanırken, kabul edilen cevap iletişim kutusu çerçevesi ve iç içerik görünümü arasında küçük bir dikey boşluk oluşturduğundan bu çözüm benim için daha iyi çalışır.
Sebastian Roth

38

başlığı kaldırabilirsiniz

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

Burada iletişim kutusu, iletişim kutumun adıdır.


RequestFeature önce setContentView () deme ()
jlopez

29

Kodunuzu kullanırsanız requestWindowFeature(Window.FEATURE_NO_TITLE); daha önce gittiğinden emin olun, dialog.setContentView();aksi takdirde uygulamanın çökmesine neden olur.


daha önce denemek için şüphe ve açıkça işe yaradığını oldukça şaşırttı. android.developer.com'da, özel bir iletişim kutusunun bir başlığı olması gerektiğini açıkça söylediler. : P
richardlin

10

Bunu yapmanın Üç Yolu'nu buldum>

1) requestWindowFeature'ı kullanma

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

2) Stili kullanma (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) AndroidManifest.xml'de XML temasını kullanma

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

1
Birinci yöntem dialog.requestWindowFeature (Window.FEATURE_NO_TITLE) olmalıdır;
Jon Willis

10

Custom_Dialog.java sınıfınıza şunu ekleyin: 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 
    }
}

Bu benim için işe yarayan tek şeydi ... bir nedenden dolayı diğer tüm öneriler işe yaramadı. Önerebileceğim tek şey, kurucuyu herkese açık hale getirmek ve ayrıca sadece bir Bağlam alan diğer Dialog kurucusunu sağlamaktır
Justin

7

olivierg'in yanıtı benim için çalıştı ve özel bir Dialog sınıfı oluşturmak istediğiniz yolsa en iyi çözümdür. Ancak, AlertDialog sınıfını kullanamam beni rahatsız etti. Varsayılan sistem AlertDialog stilini kullanabilmek istedim. Özel bir iletişim sınıfı oluşturmanın bu tarzı olmaz.

Bu yüzden özel bir sınıf oluşturmak zorunda kalmadan çalışacak bir çözüm (hack) buldum, mevcut inşaatçıları kullanabilirsiniz.

AlertDialog, başlık için yer tutucu olarak içerik görünümünüzün üzerine bir Görünüm koyar. Görünümü bulup yüksekliği 0 olarak ayarlarsanız, alan kaybolur.

Bunu 2.3 ve 3.0'da test ettim, henüz her versiyonda çalışmaz.

İşte bunu yapmak için iki yardımcı yöntem:

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

İşte nasıl kullanıldığına dair bir örnek:

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

    showDialogWithNoTopSpace(yourCustomView, dialog, true);

Bunu bir DialogFragment ile kullanıyorsanız, DialogFragment'ın onCreateDialogyöntemini geçersiz kılın . Ardından iletişim kutunuzu oluşturun ve yukarıdaki ilk örnek gibi geri gönderin. Tek değişiklik, iletişim kutusundaki show () öğesini çağırmamak için 3. parametre (show) olarak false iletmenizdir. DialogFragment bunu daha sonra ele alacaktır.

Misal:

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

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

Bunu daha fazla test ederken, gerekli ek ayarlarla güncelleyeceğinizden emin olacağım.


Zarif çözüm, +1. Bunu bir DialogFragment içinde nasıl kullanacağınızı biliyor musunuz?
Binoy Babu

@Binoy, DialogFragments'ın cevabını güncelledi (aslında kişisel olarak nasıl kullanıyorum)
cottonBallPaws

6

Bu sorunun hala geçerli olup olmadığını bilmiyorum, ama benim durumumda, DialogFragment'a geçiş yaptığımda,

requestWindowFeature(Window.FEATURE_NO_TITLE);

bir seçenek değildi, ama kullanabilirim

setStyle(STYLE_NO_TITLE, 0);

bunun yerine aynı sonucu verir.


setStyle(STYLE_NO_TITLE, 0);Açıklığa kavuşturmak için, bu satır ( ) DialogFragment sınıfınızın onCreate yöntemine gider.
Fiyat

4

Oluşturucuyu kullanarak başlığı boş dizeye ayarlayın.

    Builder builder = new AlertDialog.Builder(context);
    builder.setTitle("");
...
    builder.show();

3

tüm iletişim kutusundaki "gravity" özelliğini "center" olarak ayarlayın. Sonra iletişim kutusundaki ortalanmış istemediğiniz tüm alt bileşenlere bu ayarı geçersiz kılmanız gerekir.


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

3

XML'de bir tema kullanın

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

3

Biz sadece olmadan iletişim kullanırsanız setTitle(), o zaman başlık alanını kaldırarak bu işe yarayacak?

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

3

Bunu şimdi kullanabileceğinizi düşünün:

AlertDialog dialog = new AlertDialog.Builder(this)
  .setView(view)
  .setTitle("")
  .create()

2
ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "", 
                             "Loading. Please wait...", true);

başlıksız iletişim kutusu oluşturur


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

2

AlertDialog kullanırken, kullanmamak setTitle()başlığın kaybolmasını sağlar


1

Bir grup hacklemeden sonra, bunu işe aldım:

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

dialogburada ne var vegetResources()
Kartheek s

1

Bunu AlertDialog, Sınıftan şu şekilde uzanan yeni Sınıf tanımlayarak kullanmadan yapabilirsiniz Dialog:

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

1

AlertBuilderBaşlığın kaybolması için yapabileceğiniz bir şey :

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

1

Bunu kullan

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

0

dialog_custom .requestWindowFeature (Window.FEATURE_NO_TITLE);

bu, başlığı cutsom iletişim kutusundan kaldıracaktır.

İçerik eklemeden önce bu satırı ekleyin. Örneğin;

     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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.