सामग्री जोड़ने से पहले requestFeature () को कॉल किया जाना चाहिए


135

मैं एक कस्टम शीर्षक को लागू करने की कोशिश कर रहा हूं:

यहाँ मेरा हेल्पर वर्ग है:

import android.app.Activity;
import android.view.Window;

public class UIHelper {
    public static void setupTitleBar(Activity c) {
        final boolean customTitleSupported = c.requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

        c.setContentView(R.layout.main);

        if (customTitleSupported) {
            c.getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.titlebar);
        }
    }
}

यहाँ है जहाँ मैं इसे onCreate () में कहता हूँ:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setupUI();
}

private void setupUI(){
     setContentView(R.layout.main);
     UIHelper.setupTitleBar(this);
}

लेकिन मुझे त्रुटि मिलती है:

requestFeature() must be called before adding content

यहाँ उत्तर दिया गया: stackoverflow.com/questions/16939814/…
कर्म

जवाबों:


331

ठीक है, बस वही करें जो त्रुटि संदेश आपको बताता है।

setContentView()पहले फोन मत करोrequestFeature()

ध्यान दें:

जैसा कि टिप्पणियों में कहा गया है, दोनों ActionBarSherlockऔर AppCompatपुस्तकालय के लिए, requestFeature()पहले कॉल करना आवश्यक हैsuper.onCreate()


60
लानत है, यह एक उत्तम दर्जे का उत्तर है।
एक व्यक्ति

60
ActionBarSherlock के लिए, requestFeature()पहले कॉल करना भी आवश्यक है super.onCreate()। संदर्भ: github.com/JakeWharton/ActionBarSherlock/issues/…
सारण

1
क्या होगा यदि आपको एक शीर्षक पट्टी के बिना एक लेआउट दिखाने की आवश्यकता है और फिर एक शीर्षक पट्टी के साथ एक दिखाएं? आपको requestWindowFeature(Window.FEATURE_NO_TITLE)इसे छिपाने के लिए उपयोग करना होगा, फिर setContentView()अपने पहले लेआउट के लिए, फिर requestWindowFeature(Window.FEATURE_CUSTOM_TITLE)शीर्षक बार को फिर से दिखाने के लिए। वह setContentView()दूसरी बार के बाद होगा ।
एमएसबीजी

35
AppCompat में @Saran के रूप में इसका एक ही मामला है। आपको अपने requestFeatureपहले कॉल करना चाहिएsuper.onCreate()
जैसन ब्रूक्स

7
यह उत्तर बहुत मदद नहीं करता है ... लेकिन मुझे क्या पता है
ओजोनुवा जुड ओचलिफु

23

मुझे पता है कि यह एक साल से अधिक पुराना है, लेकिन कॉल करने से requestFeature()मेरी समस्या कभी हल नहीं हुई। वास्तव में मैं इसे बिलकुल नहीं कहता।

यह एक ऐसा मुद्दा था, जिसके बारे में मुझे लगता है कि यह गलत है। अपनी सभी खोज के बावजूद, मुझे कभी भी एक उपयुक्त समाधान नहीं मिला जब तक कि मैं किसी दृश्य को अलग करने के विभिन्न तरीकों के साथ नहीं खेला।

AlertDialog.Builder एक आसान उपाय है, लेकिन यदि आप इसका उपयोग करते हैं तो बहुत काम करने की आवश्यकता है onPrepareDialog() उस दृश्य को अपडेट करने लिए लिए ।

एक अन्य विकल्प संवाद के लिए AsyncTask का लाभ उठाना है।

एक अंतिम समाधान जो मैंने उपयोग किया है वह नीचे है:

public class CustomDialog extends AlertDialog {

   private View content;

   public CustomDialog(Context context) {
       super(context);

       LayoutInflater li = LayoutInflater.from(context);
       content = li.inflate(R.layout.custom_view, null);

       setUpAdditionalStuff(); // do more view cleanup
       setView(content);           
   }

   private void setUpAdditionalStuff() {
       // ...
   }

   // Call ((CustomDialog) dialog).prepare() in the onPrepareDialog() method  
   public void prepare() {
       setTitle(R.string.custom_title);
       setIcon( getIcon() );
       // ...
   }
}

* कुछ अतिरिक्त नोट:

  1. शीर्षक छिपाने पर भरोसा मत करो। शीर्षक सेट नहीं होने के बावजूद अक्सर एक खाली जगह होती है।
  2. शीर्ष लेख पाद लेख और मध्य दृश्य के साथ अपना स्वयं का दृश्य बनाने का प्रयास न करें। जैसा कि ऊपर कहा गया है, हेडर FEATURE_NO_TITLE के अनुरोध के बावजूद पूरी तरह से छिपा नहीं हो सकता है।
  3. रंग विशेषताओं या पाठ आकार के साथ अपनी सामग्री देखने की भारी शैली न करें। संवाद को संभालने दें, अन्य बुद्धिमान आप एक गहरे नीले रंग के संवाद पर काला पाठ डालने का जोखिम उठाते हैं क्योंकि विक्रेता रंगों को उलट देता है।

मूल रूप से मैंने onCreate () विधि में setTitle () और setIcon () पोस्ट किया, लेकिन संपादन ने इसे तैयारी () विधि में स्थानांतरित कर दिया, जिसे onPrepareDialog () विधि के दौरान कहा जाता है।
कुकस्टर

2
साझा करने के लिए धन्यवाद। मुझे लगता है कि निम्नलिखित पंक्ति content = inflater.inflate(R.layout.custom_view, null);शायद होनी चाहिए content = li.inflate(R.layout.custom_view, null);। तो, inflaterद्वारा प्रतिस्थापित किया जाना है li
एलेनर

14

मैं एक DialogFragment और उपरोक्त जवाब काम नहीं कर रहा था । मुझे शीर्षक हटाने के लिए getDialog () का उपयोग करना पड़ा:

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

@ojonugwaochalifu यह कुछ समय पहले था, इसलिए मुझे ठीक से याद नहीं है, लेकिन मुझे यकीन है कि इसे सेट कॉन्टेंक्स्ट्यूव () विधि से पहले किया जाना चाहिए
अवैध तर्क

1
किसी एक ही समस्या का सामना करने के लिए: मैंने इस कोड को onViewCreated () में जोड़ा;
7geeky

2

क्या त्रुटि बिल्कुल नहीं बताती है कि क्या गलत है? आप कॉल कर रहे हैं requestWindowFeatureऔर कॉल करने के setFeatureIntबाद setContentView

वैसे, आप setContentViewदो बार क्यों बुला रहे हैं ?


2

यदि आप अपनी गतिविधि को बढ़ाने के लिए AppCompatActivity का उपयोग कर रहे हैं तो SDK संस्करण 23 और उसके बाद के संस्करण के लिए, उसी RuntimeException को फेंक दिया जाता है। यदि आपकी गतिविधि सीधे गतिविधि से निकलती है तो ऐसा नहीं होगा।

यह Google पर एक ज्ञात समस्या है जैसा कि https://code.google.com/p/android/issues/detail?id=186440 में वर्णित है

इसके लिए प्रदान किए गए कार्य के लिए RequestFeature () का उपयोग करने के बजाय supportRequestWindowFeature () विधि का उपयोग करना है।

कृपया अपवोट करें यदि यह आपकी समस्या को हल करता है।


1

बदले संकलित SDK संस्करण , लक्ष्य SDK संस्करण के लिए बिल्ड उपकरण संस्करण के लिए 24.0.0 में build.gradle यदि u अनुरोध फ़ीचर में इस मुद्दे का सामना


0

मेरे मामले में मैं पता चला है DialogFragmentमें Activity। इस संवाद खंड में मैंने डायलॉगफ्रेग्मेंट में ब्लैक बॉर्डर हटाने के रूप में लिखा है :

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setStyle(STYLE_NO_FRAME, 0)
}

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    super.onCreateDialog(savedInstanceState)

    val dialog = Dialog(context!!, R.style.ErrorDialogTheme)
    val inflater = LayoutInflater.from(context)
    val view = inflater.inflate(R.layout.fragment_error_dialog, null, false)
    dialog.setTitle(null)
    dialog.setCancelable(true)
    dialog.setContentView(view)
    return dialog
}

या तो हटाओ या चंदे setStyle(STYLE_NO_FRAME, 0)में onCreate()करो / हटाओ onCreateDialog। क्योंकि डायलॉग बनने के बाद डायलॉग सेटिंग्स बदल गई हैं।


0

मेरे पास डायलॉग्स के साथ एक विस्तारित डायलॉगफ्रेगमेंट पर आधारित यह मुद्दा था, जो एपीआई 26 पर चलने वाले उपकरणों पर ठीक काम करता था, लेकिन एपीआई 23 के साथ विफल रहा। उपरोक्त रणनीतियों ने काम नहीं किया, लेकिन मैंने ऑनक्रीट व्यू विधि (जिसे एक और द्वारा जोड़ा गया था) को हटाकर समस्या का समाधान किया हाल ही में एंड्रॉइड स्टूडियो टेम्पलेट) डायलॉगफ्रैगमेंट से और ऑनक्रिएटडियल में डायलॉग बना रहा है।

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