2011-01-28 12 views
8

पर यह मुझे पागलपन के कगार पर ले जा रहा है!"android.util.AndroidRuntimeException: requestFeature() को सामग्री जोड़ने से पहले कॉल किया जाना चाहिए" showDialog (dialogId)

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.myLayout); 

    mMyButton = (Button) findViewById(R.id.myButtonId); 
    mMyButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      showDialog(ID_MYDIALOG); 
     } 
    }); 
} 

मैं अपनी संवाद बिल्डर वर्ग (एक सिंगलटन) में लिखा है के बाद से मैं कई अन्य गतिविधि की राशि अपने आवेदन में:

मैं एक गतिविधि है, जहां मैं एक onClickListener के साथ एक बटन दृश्य प्रारंभ, इसलिए की तरह है जो दिया गतिविधि के लिए onCreateDialog(int id) समारोह में, संवाद के एक सामान्य सेट का उपयोग किया जाएगा, इसलिए मैं फोन:

@Override 
protected Dialog onCreateDialog(int id) { 
    Dialog dialog; 

    switch (id) { 
     case ID_MYDIALOG: 
      dialog = DialogBuilder.getInstance().getMyDialog(this, mUri, mListener); 
      break; 

     default: 
      dialog = null; 
      break; 
    } 

    return dialog; 
} 

mUri और mListener चर कहीं परिभाषित कर रहे हैं और मुझे लगता है कि वें सत्यापित किया है आईपी ​​वैध हैं। सिंगलटन DialogBuilder वर्ग के प्रासंगिक भागों इस तरह दिखता है:,

public AlertDialog getMyDialog(Context context, Uri uri, DialogInterface.OnClickListener listener) { 
    // Inflate the custom body for the AlertDialog. 
    LayoutInflater layoutInflater = LayoutInflater.from(context); 
    View view = layoutInflater.inflate(R.layout.myDialogBody, null); 

    // Get the data to show in the dialog. 
    Cursor cursor = context.getContentResolver().query(uri, null, null, null, null); 
    cursor.moveToFirst(); 

    // Create a suitable data adapter and use it to populate the dialog body with data. 
    MyDialogDataAdapter adapter = new MyDialogDataAdapter(context, cursor); 

    // Populate the GridView in the dialog body with data. 
    GridView grid = (GridView) view.findViewById(R.id.myDialogDataGrid); 
    grid.setAdapter(adapter); 

    return new AlertDialog.Builder(context) 
    .setIcon(R.drawable.myDialogIcon) 
    .setTitle(R.string.myDialogTitle) 
    .setView(view) 
    .setPositiveButton(R.string.myDialogDone, listener) 
    .create(); 
} 

अब जब मैं अपने आवेदन चलाने के लिए और बटन को टैप करें (यानी mMyButton) मैं निम्न अपवाद स्टैक ट्रेस मिलती है:

E/AndroidRuntime(1247): FATAL EXCEPTION: main 
E/AndroidRuntime(1247): android.util.AndroidRuntimeException: requestFeature() must be called before adding content 
E/AndroidRuntime(1247): at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:181) 
E/AndroidRuntime(1247): at com.android.internal.app.AlertController.installContent(AlertController.java:203) 
E/AndroidRuntime(1247): at android.app.AlertDialog.onCreate(AlertDialog.java:251) 
E/AndroidRuntime(1247): at android.app.Dialog.dispatchOnCreate(Dialog.java:307) 
E/AndroidRuntime(1247): at android.app.Activity.createDialog(Activity.java:886) 
E/AndroidRuntime(1247): at android.app.Activity.showDialog(Activity.java:2557) 
E/AndroidRuntime(1247): at android.app.Activity.showDialog(Activity.java:2524) 
E/AndroidRuntime(1247): at com.dbm.myApp.myActivity$4.onClick(myActivity.java:266) 
E/AndroidRuntime(1247): at android.view.View.performClick(View.java:2534) 
E/AndroidRuntime(1247): at android.view.View$PerformClick.run(View.java:9210) 
E/AndroidRuntime(1247): at android.os.Handler.handleCallback(Handler.java:587) 
E/AndroidRuntime(1247): at android.os.Handler.dispatchMessage(Handler.java:92) 
E/AndroidRuntime(1247): at android.os.Looper.loop(Looper.java:123) 
E/AndroidRuntime(1247): at android.app.ActivityThread.main(ActivityThread.java:3652) 
E/AndroidRuntime(1247): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(1247): at java.lang.reflect.Method.invoke(Method.java:507) 
E/AndroidRuntime(1247): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
E/AndroidRuntime(1247): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
E/AndroidRuntime(1247): at dalvik.system.NativeStart.main(Native Method) 
W/ActivityManager( 212): Force finishing activity com.dbm.myApp/.myActivity 

हैं मैं स्टैक ट्रेस को सही ढंग से समझता हूं कि जिस बिंदु पर मैं अपना बटन टैप करता हूं, उस मुद्दे को ट्रिगर किया जाता है (com.dbm.myApp.myActivity$4.onClick(myActivity.java:266) के अनुसार जो सटीक showDialog(ID_MYDIALOG); लाइन है)।

साथी एंड्रॉइड डेवलपर्स का क्या कहना है? आप क्या सोचते हैं जो मेरी समस्या पैदा कर रहा है?

यह मानना ​​उचित है कि उपरोक्त कोड संकलन और इकाई परीक्षण आदि के अनुसार मान्य है। दिए गए कोड को, हालांकि, फोरम फिट करने के लिए सरलीकृत और छीन लिया गया है, इसलिए कृपया टिप्पणी करने का प्रयास न करें नामकरण सम्मेलन आदि

+0

मैंने अब सिंगलटन 'डायलॉगबिल्डर' वर्ग में 'getMyDialog' फ़ंक्शन में सब कुछ टिप्पणी करने के लिए परीक्षण किया है और एक ही समस्या बनी हुई है। मुझे लगता है कि मेरी गतिविधि ठीक से शुरू नहीं हुई है। – dbm

+0

मैं इस पर आया हूं लेकिन मुझे सटीक फ़िक्स याद नहीं है :-(क्या आपको कॉल करने की आवश्यकता है: 'requestWindowFeature (Window.FEATURE_CUSTOM_TITLE);' अपने डायलॉगबिल्डर वर्ग में? – Blundell

+0

एक अच्छी टिप, मैंने अभी इसका परीक्षण किया, लेकिन दुर्भाग्य से यह मुद्दा बनी हुई है। इसके अलावा मुझे अनुरोध फीचर() फ़ंक्शन (या शॉर्ट-कट संस्करण: requestWindowFeature()) पर थोड़ा सा पढ़ना पड़ सकता है और वे वास्तव में मेरे एप्लिकेशन के साथ क्या करते हैं। – dbm

उत्तर

17

मुझे लगता है कि मैं इस मुद्दे का हल हो सकता है: यदि मैं किसी कारण से साथ AlertDialog बनाएँ:

return new AlertDialog.Builder(context) 
    .setIcon(R.drawable.myDialogIcon) 
    .setTitle(R.string.myDialogTitle) 
    .setView(view) 
    .setPositiveButton(R.string.myDialogDone, listener) 
    .show(); 

अर्थात के बजाय .show(); के साथ समस्या अब मौजूद नहीं है। मुझे नहीं पता कि यह क्यों काम करता है या AlertDialog.Builder::create(); फ़ंक्शन से संबंधित फ़ंक्शन (संबंधित फ़ंक्शन नामों में दिखाई देने वाले स्पष्ट अंतर से अधिक) क्यों काम करता है।

+1

मेरे अपने प्रश्न का उत्तर देने के लिए खेद है। लेकिन मुझे यकीन नहीं है कि मैं अन्यथा स्पष्ट रूप से और निर्विवाद रूप से कैसे दिखा सकता हूं कि मैंने अपनी समस्या हल की है। – dbm

+0

डाउनवोट क्यों? कम से कम एक टिप्पणी छोड़ने की सभ्यता है। – dbm

+1

मैंने पाया कि dialog.findViewById, गतिविधि प्रबंधित संवाद का उपयोग न करने पर उल्लिखित अपवाद को फेंक दिया गया है। मैंने इस लगभग समान प्रश्न में इसके बारे में लिखा है http://stackoverflow.com/questions/4826407/android-util-androidruntimeexception-requestfeature-must-be-called-before-ad – arberg

3

कन्स्ट्रक्टर के ठीक बाद .setView(view) पर कॉल करने का प्रयास करें।

return new AlertDialog.Builder(context) 
    .setView(view) 
    .setIcon(R.drawable.myDialogIcon) 
    .setTitle(R.string.myDialogTitle) 
    .setPositiveButton(R.string.myDialogDone, listener) 
    .create(); 

यह मदद करता है?

+0

मैंने अब आपके सुझाव का परीक्षण किया है। मैंने पहले अपना संवाद बनाने और इसे तुरंत लागू करने के बाद मूल्यों को असाइन करने का भी प्रयास किया है, लेकिन यह विफल रहता है। – dbm

+0

यह मेरे लिए काम कर रहा है –

1

यह नहीं solution..but मैं थोड़ा इस टुकड़े से हैरान था हो सकता है:

mMyButton.setOnClickListener(new View.OnClickListener() { 
    showDialog(ID_MYDIALOG); 

मैंने सोचा कि आप onClick श्रोता के अंदर लागू करना चाहिए? क्या मै गलत हु?

+1

सिर के लिए धन्यवाद! आप अपनी टिप्पणी में बिल्कुल सही हैं। और मेरे लाइव कोड में यह सही ढंग से लिखा गया है ('ऑनक्लिक' फ़ंक्शन को कार्यान्वित करना)। मैं अपना प्रश्न सबमिट करने के लिए उत्सुक था, हालांकि (इसके लिए खेद है)। – dbm

+1

@ डीबीएम अपने स्वयं के प्रश्न का उत्तर स्वागत है, खासकर यदि किसी और ने इसका सही उत्तर नहीं दिया है! –

संबंधित मुद्दे

 संबंधित मुद्दे