बिना टाइटल के DialogFragment कैसे बनाएं?


358

मैं अपने ऐप के बारे में कुछ मदद संदेश दिखाने के लिए एक DialogFragment बना रहा हूं। एक चीज के अलावा सब कुछ ठीक काम करता है: खिड़की के शीर्ष पर एक काले रंग की पट्टी होती है जो डायलॉगफ्रैगमेंट को दिखाती है, कि मुझे लगता है कि शीर्षक के लिए आरक्षित है, कुछ जिसे मैं उपयोग नहीं करना चाहता हूं।

यह विशेष रूप से दर्दनाक है क्योंकि मेरे कस्टम डायलॉगफ्रैगमेंट एक सफेद पृष्ठभूमि का उपयोग करता है, इसलिए यह बदलाव एक तरफ छोड़ दिया जाने के लिए बहुत कुख्यात है।

मुझे इसे और अधिक ग्राफिकल तरीके से दिखाने दें:

यहां छवि विवरण दर्ज करें

अब मेरे DialogFragment के लिए XML कोड इस प्रकार है:

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

और संवाद कोड लागू करने वाले वर्ग का कोड:

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

}

और मुख्य गतिविधि में निर्माण प्रक्रिया:

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

मैं वास्तव में नहीं जानता कि क्या यह जवाब, एक डायलॉग से संबंधित है, यहां भी फिट बैठता है एंड्रॉइड: एक शीर्षक के बिना डायलॉग कैसे बनाएं?

मैं इस शीर्षक क्षेत्र से कैसे छुटकारा पा सकता हूं?


इस showHelpDialog विधि को FragmentActivity या गतिविधि वर्ग से कहा जाता है ??
Sjk

80
+1 ... मुझे लगता है कि यह पहला मौका है जब मैंने एक प्रश्न के उत्तर को पढ़ते हुए हँसा
जेसन क्रॉस्बी

1
हास्य की भावना के लिए +1। समस्या के बारे में आपकी चित्रमय व्याख्या बिल्कुल इस मुद्दे पर मुझे कैसी लगी!
लुइस अर्तोला

जवाबों:


589

बस इस कोड को अपने में जोड़ें HelpDialog.onCreateView(...)

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

इस तरह आप स्पष्ट रूप से शीर्षक के बिना एक खिड़की पाने के लिए कह रहे हैं :)


संपादित करें

जैसा कि @DataGrahamऔर @Blundellनीचे टिप्पणी पर बताया गया है, इसके onCreateDialog()बजाय विधि में एक शीर्षक-कम विंडो के लिए अनुरोध जोड़ना अधिक सुरक्षित है onCreateView()। जब आप अपने टुकड़े का उपयोग नहीं कर रहे हैं तो इस तरह आप एनपीई को रोक सकते हैं 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;
}

61
बेशक आप सुविधा पद्धति का भी उपयोग कर सकते हैं getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE)...
a.bertucci

8
इसके बजाय onCreateDialog में ऐसा करना चाहते हैं, यदि आपके टुकड़े को संवाद के रूप में नहीं दिखाया गया है ।
दाताग्राम

2
@ a.bertucci तुम सबसे अच्छे हो! हालाँकि अगर आप कभी भी उस टुकड़े को एक सामान्य फ्रैगमेंट के रूप में जोड़ते getDialogहैं, तो आपको एक NPE
Blundell

4
यह मेरे संवाद की चौड़ाई को कम कर देता है। इस मुद्दे के लिए कोई समाधान?
घड़ीसाज़

2
@ क्लॉकस्मिथ android:layout_widthआपके डायलॉग सेट के लिए लेआउट में रूट दृश्य के लिए विशेषता है wrap_content?
ataulm

78

डायलॉग टुकड़ा में सेटिसल विधि है, जिसे दृश्य निर्माण जावा डॉक्टर से पहले बुलाया जाना चाहिए । साथ ही संवाद की शैली को भी इसी विधि के साथ सेट किया जा सकता है

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

3
अधिकतम, मैंने सेटस्टाइप (STYLE_NO_TITLE, 0) का उपयोग करने का प्रयास किया। लेकिन नतीजा यह है कि मेरा संवाद चौड़ाई के 1/4 आकार में कट जाता है, इसलिए संवाद में संदेश सभी को नहीं दिखाया गया है।
vliux

1
मुझे लगता है कि एंड्रॉइड स्रोतों को देखने से दो तरीके वास्तव में कोड में समान हैं। मैं एक ही मुद्दा रहा हूँ जहाँ यह 1/4 आकार में कटौती कर रहा है, हालांकि :(। अभी तक इसे हल नहीं किया है।
abhishekmukherg

1
यह इसे करने का सबसे अच्छा तरीका है।
Psypher

1
@Sam आप सही हैं, विंडो शैली onSaveInstanceState में बनी हुई है और बाद में बहाल हो गई है। मेरा अब भी मानना ​​है कि सामान्य तौर पर ऑनक्रीट () में सब कुछ शुरू करना एक बेहतर अभ्यास है।
ब्लेडरोडर

1
आपके लेआउट के मूल दृश्य के सभी प्रत्यक्ष बच्चों के लिए match_parant की चौड़ाई होनी चाहिए। फिर आपको एक सामान्य चौड़ाई वाला एक संवाद मिलेगा।
निकोलसवाईज

22
FragmentManager manager = getSupportFragmentManager();
SettingsDialog sd = new SettingsDialog();
sd.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
sd.show(manager, "settings_dialog");

1
sd.setStyle (DialogFragment.STYLE_NORMAL, android.R.style.Theme_Holo_Dialog_NoActionBar) मैं कहूँगा
Androider

OMG इतने परीक्षण के बाद, यह एकमात्र टुकड़ा है जिसने काम किया।
एलेक्स

16

आसान तरीका आजमाएं

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NO_TITLE, 0);
}

सैमसंग गैलेक्सी एस 4 पर ठीक काम करता है।
कूलमाइंड

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

10

शैली को Theme_Holo_Dialog_NoActionBar पर सेट करें:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NORMAL, android.R.style.Theme_Holo_Dialog_NoActionBar);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.