एंड्रॉइड: एक शीर्षक के बिना एक डायलॉग कैसे बनाएं?


269

मैं Android में एक कस्टम संवाद उत्पन्न करने की कोशिश कर रहा हूं। मैं अपना डायलॉग इस तरह बनाता हूं:

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

डॉयलाग के शीर्षक को छोड़कर एवरीथिंग ठीक काम करती है। यहां तक ​​कि अगर मैं संवाद का शीर्षक सेट नहीं करता हूं तो संवाद पॉपअप में संवाद की स्थिति में एक रिक्त स्थान होता है।

क्या डायलॉग के इस हिस्से को छिपाने का कोई तरीका है?

मैंने इसे AlertDialog के साथ आज़माया, लेकिन ऐसा लगता है कि लेआउट ठीक से सेट नहीं किया गया है:

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

अगर मैं इस कोड का उपयोग करता हूं तो मुझे अंतिम पंक्ति में एक शून्य सूचक अपवाद मिलता है। संवाद अशक्त नहीं है, इसलिए मुझे पुनः प्राप्त करने का प्रयास करने वाला TextView मौजूद नहीं है।
अगर मैं उस हिस्से को असहज करता हूं जहां मैं डायलॉग कंस्ट्रक्टर का उपयोग करता हूं तो सब कुछ ठीक काम करता है लेकिन मेरे संवाद लेआउट के ऊपर शीर्षक के लिए।


7
@Janusz का जवाब rechoose stackoverflow.com/a/3407871/632951
Pacerier

पिछले उत्तर के बजाय stackoverflow.com/questions/6263639/… आज़माएं ... सरल उत्तर
मोहम्मद मंसूर

बस AlertDialog.Builder.setTitle () को कॉल न करें और आपका डायलॉग बिना शीर्षक के दिखाई देगा।
मार्वट्रॉन

जवाबों:


208

आप किसी संवाद का शीर्षक छिपाकर उपयोग कर सकते हैं:

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);


इस उत्तर का पिछला संस्करण, जो अधूरा है:

आपको एक का उपयोग करने की आवश्यकता है AlertDialogकस्टम संवाद के बारे में Android डेवलपर की साइट पर एक अच्छी व्याख्या है ।

बहुत ही संक्षिप्त सारांश में, आप आधिकारिक वेबसाइट से नीचे की तरह कोड के साथ ऐसा करते हैं। यह एक कस्टम लेआउट फ़ाइल लेता है, इसे फुलाता है, इसे कुछ मूल पाठ और आइकन देता है, फिर बनाता है। आप इसे तब दिखाएंगे 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();

टिप्पणी के जवाब में:

मुझे लगता है कि आईडी के साथ TextView nrआपके द्वारा फुलाए जा रहे दृश्य में है View view = inflater....। यदि ऐसा है, तो आपको केवल एक बिट बदलने की आवश्यकता है: dialog.findView...इसे बनाने के बजाय view.findView...। फिर एक बार जब आप ऐसा कर लेते हैं, तो बिल्डर को क्रिएट करने के लिए डायलॉग (), या यहां तक ​​कि बिल्डर .show () का उपयोग करना याद रखें।


4
मुझे लगता है कि आपने प्रश्न को गलत बताया होगा? Janusz में पहले से ही कस्टम डायलॉग प्रदर्शित है और बस शीर्षक हटाने की जानकारी की आवश्यकता है
Donal Rafferty

17
खैर, आधिकारिक दस्तावेज के अनुसार, "आधार डायलॉग क्लास के साथ किए गए एक डायलॉग का शीर्षक होना चाहिए। यदि आप सेटिटेल () को कॉल नहीं करते हैं, तो शीर्षक के लिए उपयोग किया जाने वाला स्थान खाली रहता है, लेकिन फिर भी दिखाई देता है। यदि आप डॉन '। t बिल्कुल भी एक शीर्षक नहीं चाहता है, तो आपको AlertDialog वर्ग का उपयोग करके अपना कस्टम संवाद बनाना चाहिए। " मैंने व्यक्तिगत रूप से इसके साथ प्रयोग नहीं किया है, लेकिन यह सुझाव देगा कि यहां तक ​​कि एक कस्टम संवाद लेआउट या थीम का उपयोग करते हुए, शीर्षक स्थान को निकालना असंभव है।
स्टीव हेली

2
दूसरा विचार: मुझे लगता है कि हम "शीर्षक" को अलग तरह से समझ रहे हैं। मुझे लगता है कि वह पॉप-अप विंडो के शीर्ष पर अंतरिक्ष के बारे में बात कर रहा है, ऐप के शीर्ष पर शीर्षक नहीं।
स्टीव हेली

11
@SteveHaley, नहीं यह संभव नहीं है कि निम्नलिखित लाइन का उपयोग करके इसे छिपाया जा सकेdialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
Sami Eltamawy

1
सुनिश्चित करें कि आप डायलॉग करते हैं ।requestWindowFeature (Window.FEATURE_NO_TITLE); पहले आप अपने संवाद दृश्य को बढ़ाएँ।
एलेक्सी पोडलासोव

585

FEATURE_NO_TITLE काम करता है जब स्क्रैच से डायलॉग बनाते हैं:

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

लेकिन यह काम नहीं करता है जब एक AlertDialog (या बिल्डर का उपयोग करके), क्योंकि यह पहले से ही शीर्षक को निष्क्रिय कर देता है और आंतरिक रूप से एक कस्टम का उपयोग करता है।

मैंने एसडीके स्रोतों को देखा है, और मुझे लगता है कि इसके आसपास काम नहीं किया जा सकता है। तो शीर्ष रिक्ति को दूर करने के लिए, एकमात्र समाधान सीधे डायलॉग क्लास का उपयोग करके, स्क्रैच IMO से एक कस्टम संवाद बनाना है।

इसके अलावा, कोई भी स्टाइल के साथ ऐसा कर सकता है, जैसे 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);

स्क्रैच से एक कस्टम संवाद बनाने के बजाय, मैंने oliverg द्वारा सुझाए अनुसार style.xml बनाया। और फिर, मैंने मैनफ़ेस्ट फ़ाइल में <गतिविधि> ... </ acitivity> की घोषणा के लिए android: theme = "@ style / FullHeightDialog" जोड़ा। यह सिर्फ काम किया।
साभार

@olivierg लेकिन मुझे पूरी ऊंचाई वाले डायलॉग वाला बटन चाहिए। इसका क्या उपाय है?
पचेरियर

1
ध्यान दें कि लाइन का अनुरोध करें ।WowowFeature को SetContentView लाइन से पहले होना चाहिए ।
फेटी

हालांकि यह वास्तविक टिप्पणियों का सबसे अच्छा जवाब देता है, लेकिन स्वीकृत जवाब में समाधान मेरी राय में सबसे अच्छा है। मैंने इसे साफ-सुथरे तरीके से करना शुरू किया Dialog, लेकिन इसे बनाना AlertDialogबहुत आसान था। यह में कहा गया है के रूप में डॉक्स : 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>। यह AlertDialogभी जीवन चक्र सामान और आसान शिष्टाचार में ठीक / रद्द संभालती है।
Krøllebølle

67

अपने कोड में इस लाइन को जोड़ें

requestWindowFeature(Window.FEATURE_NO_TITLE);  

या XML में किसी थीम का उपयोग करें

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

XML एक बेहतर कार्यान्वयन होगा क्योंकि कोड संस्करण के साथ टाइटल बार बन जाता है और फिर हटा दिया जाता है जो संसाधन की बर्बादी है

ठीक है अच्छी कोशिश लेकिन यह काम नहीं कर रहा है। मुझे मिलता है: android.view.WindowManager $ BadTokenException: विंडो जोड़ने में असमर्थ - टोकन नल किसी एप्लिकेशन के लिए नहीं है यदि मैं संवाद को शॉउ करना चाहता हूं।

चेतावनी संवाद प्रकार को सिस्टम संवाद में बदलें (जैसे, TYPE_SYSTEM_OVERLAY) और देखें कि क्या यह आपकी समस्या का समाधान करता है


2
RequestFeature () से पहले setContentView () को कॉल न करें।
jlopez

61

इस तरह का उपयोग करें:

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

यह डायलॉग विंडो से किसी भी टाइटल बार को हटा देगा।


3
RequestFeature () से पहले setContentView () को कॉल न करें।
jlopez

2
मैं इसे बाद में कैसे वापस लाऊं?
एंड्रॉइड डेवलपर

58

नीचे दिए गए कोड का उपयोग करें setcontentview: -

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

नोट : आपके पास कोड समान कोड और पंक्ति में होना चाहिए। setContentView लाइन से पहलेrequestWindowFeature होना चाहिए ।


डायलॉगफ्रैगमेंट में उपयोग करते समय, यह समाधान मेरे लिए बेहतर काम करता है क्योंकि स्वीकृत उत्तर संवाद फ्रेम और आंतरिक सामग्री दृश्य के बीच एक छोटे ऊर्ध्वाधर अंतर पैदा करता है।
सेबेस्टियन रोथ

38

आप शीर्षक हटा सकते हैं

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

जहाँ संवाद मेरे संवाद का नाम है।


RequestFeature से पहले setContentView () कॉल न करें ()
jlopez

29

आपके कोड में यदि आप उपयोग करते requestWindowFeature(Window.FEATURE_NO_TITLE); हैं तो सुनिश्चित करें कि यह पहले जाता है dialog.setContentView();अन्यथा यह एप्लिकेशन क्रैश होने का कारण बनता है।


बल्कि इससे पहले कि कोशिश करने के लिए संदेह और काफी आश्चर्य है कि यह स्पष्ट रूप से काम करता है। जब से android.developer.com में उन्होंने स्पष्ट रूप से कहा कि यह कस्टम डायलॉग के लिए शीर्षक होना चाहिए। : पी
रीचर्डलिन

10

मुझे ऐसा करने का थ्री वे मिला

1) RequestWindowFeature का उपयोग करना

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

2) शैली का उपयोग करना (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 में XML थीम का उपयोग करना

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

1
विधि एक डायलॉग होनी चाहिए ।requestWindowFeature (Window.FEATURE_NO_TITLE);
जॉन विलिस

10

अपने Custom_Dialog.java वर्ग में जोड़ें 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 
    }
}

यह केवल एक चीज है जो मेरे लिए काम करती है ... किसी कारण से अन्य सभी सुझावों ने काम नहीं किया। केवल एक चीज जो मैं सुझाऊंगा, वह है कंस्ट्रक्टर को सार्वजनिक करना और दूसरा डायलॉग कंस्ट्रक्टर प्रदान करना जो केवल एक कॉन्सेप्ट लेता है
जस्टिन

7

ओलिवियर के जवाब ने मेरे लिए काम किया और सबसे अच्छा समाधान है यदि एक कस्टम डायलॉग क्लास बनाना वह मार्ग है जिस पर आप जाना चाहते हैं। हालाँकि, इसने मुझे परेशान किया कि मैं AlertDialog क्लास का उपयोग नहीं कर सका। मैं डिफ़ॉल्ट सिस्टम AlertDialog शैली का उपयोग करने में सक्षम होना चाहता था। एक कस्टम संवाद वर्ग बनाने से यह शैली नहीं होगी।

इसलिए मुझे एक समाधान (हैक) मिला जो कस्टम क्लास बनाने के बिना काम करेगा, आप मौजूदा बिल्डरों का उपयोग कर सकते हैं।

AlertDialog शीर्षक के लिए प्लेसहोल्डर के रूप में आपके सामग्री दृश्य के ऊपर एक दृश्य डालता है। यदि आप दृश्य ढूंढते हैं और ऊँचाई को 0 पर सेट करते हैं, तो स्पेस चला जाता है।

मैंने अभी तक 2.3 और 3.0 पर इसका परीक्षण किया है, यह संभव है कि यह अभी तक हर संस्करण पर काम न करे।

यह करने के लिए दो सहायक विधियाँ हैं:

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

इसका उपयोग कैसे किया जाता है इसका एक उदाहरण इस प्रकार है:

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

    showDialogWithNoTopSpace(yourCustomView, dialog, true);

यदि आप इसे डायलॉगफ्रैगमेंट के साथ उपयोग कर रहे हैं, तो डायलॉगफ्रेगमेंट की onCreateDialogविधि को ओवरराइड करें । फिर ऊपर दिए गए पहले उदाहरण की तरह अपना संवाद बनाएं और वापस लौटाएँ। एकमात्र परिवर्तन यह है कि आपको 3 के पैरामीटर (शो) के रूप में गलत पास करना चाहिए ताकि यह डायलॉग पर शो () को कॉल न करे। DialogFragment बाद में संभाल लेगा।

उदाहरण:

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

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

जैसा कि मैंने इसे आगे परीक्षण किया है, मुझे आवश्यक किसी भी अतिरिक्त ट्विक्स के साथ अपडेट करना सुनिश्चित होगा।


सुरुचिपूर्ण समाधान, +1। क्या आप जानते हैं कि डायलॉगफ्रेममेंट में इसका उपयोग कैसे किया जाता है?
बिनॉय बाबू

@Binoy ने DialogFragments के जवाब को अपडेट किया (अर्थात वास्तव में मैं व्यक्तिगत रूप से इसका उपयोग कैसे करता हूं)
कपासनपावल

6

मुझे नहीं पता कि यह सवाल अभी भी वास्तविक है, लेकिन मेरे मामले में, जब मैंने डायलॉग से डायलॉगफ्रेगमेंट में स्विच किया,

requestWindowFeature(Window.FEATURE_NO_TITLE);

एक विकल्प नहीं था, लेकिन मैं उपयोग कर सकता था

setStyle(STYLE_NO_TITLE, 0);

इसके बजाय उसी परिणाम के साथ।


स्पष्ट करने के लिए, यह लाइन ( setStyle(STYLE_NO_TITLE, 0);) आपके DialogFragment वर्ग के ऑनक्रिट विधि में जाएगी।
मूल्य

4

बिल्डर का उपयोग करके शीर्षक को खाली स्ट्रिंग पर सेट करें।

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

3

संपूर्ण केंद्र पर "गुरुत्वाकर्षण" विशेषता को "केंद्र" पर सेट करें। फिर आपको संवाद में सभी बाल घटकों को उस सेटिंग को ओवरराइड करना होगा जिसे आप केंद्रित नहीं करना चाहते हैं।


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

यदि हम बिना संवाद का उपयोग करते हैं setTitle(), तो क्या यह शीर्षक के स्थान को दूर करने वाला है?

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

3

लगता है कि आप अभी इसका उपयोग कर सकते हैं:

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


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 का उपयोग करते समय, उपयोग नहीं करने setTitle()से शीर्षक गायब हो जाता है


1

हैकिंग के एक झुंड के बाद, मुझे यह काम करना पड़ा:

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

dialogयहाँ क्या है औरgetResources()
कार्तिक ने

1

आप इस तरह कक्षा AlertDialogसे विस्तार करने वाले नए वर्ग को परिभाषित किए बिना उपयोग कर सकते हैं Dialog:

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

1

AlertBuilderशीर्षक को गायब करने के लिए आप कुछ ऐसा कर सकते हैं :

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

1

इसे इस्तेमाल करो

    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

Dial_custom .requestWindowFeature (Window.FEATURE_NO_TITLE);

इससे कटऑफ डायलॉग से शीर्षक हटा दिया जाएगा।

नोट सामग्री जोड़ने से पहले इन रेखाओं को जोड़ दें .. उदाहरण के लिए

     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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.