2010-11-19 6 views
6

के लिए एक संवाद का निर्माण नहीं किया मैंने एक आवेदन है कि आप दिखाने के लिए और के साथ कई संवादों को बंद कर सकते हैं:एंड्रॉयड RuntimeException onCreateDialog आईडी

showDialog(...) 
removeDialog(...) 

मैं और आवेदन के साथ एक छोटा सा खेलने जब कोई किसी भी संवाद है स्क्रीन पर, मैं मेनू बटन दबाता हूं और मैं मुख्य एंड्रॉइड स्क्रीन पर जाता हूं।

थोड़ी देर के बाद, मैं अपने आवेदन में फिर से प्रवेश करने और कभी कभी, मैं इस RuntimeException मिलती है:

java.lang.IllegalArgumentException: Activity#onCreateDialog did not create a dialog for id 4 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2596) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2621) 
    at android.app.ActivityThread.access$2200(ActivityThread.java:126) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1932) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:4595) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:521) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.IllegalArgumentException: Activity#onCreateDialog did not create a dialog for id 4 
    at android.app.Activity.createDialog(Activity.java:878) 
    at android.app.Activity.restoreManagedDialogs(Activity.java:867) 
    at android.app.Activity.performRestoreInstanceState(Activity.java:815) 
    at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1096) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2565) 
    ... 11 more 

किसी भी विचार?

बहुत बहुत धन्यवाद।

अद्यतन, अधिक जानकारी:

वर्तमान onCreateDialog दिया गया है:

protected Dialog onCreateDialog(int id){ 
Builder b = new AlertDialog.Builder(this); 
if(id == 4){ 
    b.setMessage(...); 
    b.setItems(items, new DialogInterface.OnClickListener(){ 
    public void onClick(DialogInterface dialog, int which){ 
    Intent i = new Intent(Current.this, Another.class); 
    startActivity(i); 
    } 
    }); 
    return b.create(); 
} 
return null; 
} 

इस फ़ंक्शन का मैं क्या कॉल करने के लिए:

removeDialog(4); 
showDialog(4); 

उत्तर

2

इसी समस्या का सामना करने के बाद (और के भीतर से removeDialog को कॉल करना विश्वसनीय रूप से काम नहीं करता है), मैंने एक कामकाज विकसित किया जो काम करता है (हालांकि यह स्वीकार्य रूप से एक हैक है)।

रूप grepcode link posted by antslava में देखा, विधि performRestoreInstanceState में, onRestoreInstanceState ठीक पहले restoreManagedDialogs कहा जाता है और Bundle savedInstanceState का एक ही उदाहरण दिया जाता है।

final void performRestoreInstanceState(Bundle savedInstanceState) { 
    onRestoreInstanceState(savedInstanceState); 
    restoreManagedDialogs(savedInstanceState); 
} 

इस प्रकार, Bundle savedInstanceState कि onRestoreInstanceState विधि के भीतर से restoreManagedDialogs में भेजा जाता है संशोधित करने के लिए अवसर है।

पुनर्स्थापित किए जाने से किसी भी और सभी कामयाब संवाद रोकने के लिए, निम्नलिखित तरीके से onRestoreInstanceState को लागू कर सकते हैं:

// This same variable is defined as private in the Activity class. I need 
// access to it, so I redefine it here. 
private static final String SAVED_DIALOGS_TAG = "android:savedDialogs"; 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    final Bundle b = savedInstanceState.getBundle(SAVED_DIALOGS_TAG); 
    if (null != b) { 
     savedInstanceState.remove(SAVED_DIALOGS_TAG); 
    } 
} 

यह Bundle कुंजी "android:savedDialogs" द्वारा संदर्भित का कारण बनता है Bundle savedInstanceState, जो बाद में कॉल का कारण बनता है से निकाले जाने का restoreManagedDialogs करने के लिए तुरंत वापस जाने के लिए जब यह पता चलता है कि इस कुंजी नहीं पाया जा सकता है:

private void restoreManagedDialogs(Bundle savedInstanceState) { 
    final Bundle b = savedInstanceState.getBundle(SAVED_DIALOGS_TAG); 
    if (b == null) { 
     return; 
    } 
    ... 
} 

यहका कारण होगागतिविधि को बहाल करते समय बुलाया नहीं जा सकता है, प्रभावी रूप से किसी भी संवाद को "छुपा" कर सकता है, इस प्रकार परिदृश्य को रोकता है जहां से onCreateDialog से किसी को वापस लौटना होगा।

यह 'एक आकार सभी फिट बैठता है' समाधान नहीं है, लेकिन मेरी आवश्यकताओं को देखते हुए यह बिल फिट बैठता है। कई प्लेटफ़ॉर्म संस्करणों (1.6, 2.1, 2.2, 2.2.2, और 4.0.3) के लिए grepcode में कोड की समीक्षा करके, ऐसा प्रतीत होता है कि इस समाधान को इन मौजूदा कार्यान्वयनों को लगातार काम करना चाहिए।

0

आप OnCreateDialog कार्यान्वित के रूप में here प्रस्तुत है? जब आप पहली बार ShowDialog (4) को कॉल करते हैं, तो OnCreateDialog (4) को कॉल किया जाएगा और आपको संवाद बनाने और इसे इस विधि से वापस करने की आवश्यकता है।

+0

यूप, सभी कोड पूरी तरह से ठीक काम कर रहा है। आवेदन कहीं भी दुर्घटनाग्रस्त नहीं है। मैं वर्तमान में पॉपिंग और पूरी तरह से बंद संवाद संवाद देखता हूं। जब मैं एप्लिकेशन को पुनरारंभ करता हूं तो समस्या यादृच्छिक रूप से शुरू होती है। – zegnus

0

क्या आप onCreateDialog में संवाद को ठीक से वापस कर रहे हैं? यदि आप संवाद में संवाद करना चाहते हैं। शो() संवाद बनाते हैं लेकिन कुछ अन्य संवाद लौटाते हैं तो शायद आपको इसका परिणाम मिल सकता है।

या आप एपीआई स्तर 8 में onPrepareDialog

+0

हाँ, संवाद बिल्डर बी = नया अलर्टडिअलॉग.बिल्डर (यह) के साथ अच्छी तरह से बनाया गया है; ...; वापसी b.create(); हर बार जब मैं संवाद दिखाता हूं तो मैं removeDialog (4) को कॉल करता हूं और फिर Dialog (4) दिखाता हूं क्योंकि संवाद की सामग्री बदल जाती है। मैं PrepareDialog पर ओवरराइड नहीं करता ... – zegnus

11

में संवाद वस्तु की में हेरफेर के किसी भी प्रकार के कर रहे हैं, onCreateDialog(int)onCreateDialog(int,Bundle) के पक्ष में deprecated था। यदि आप केवल बाद की विधि को लागू करते हैं और 8 से कम एपीआई स्तर वाले डिवाइस पर ऐप चलाते हैं, तो आपको वर्णित त्रुटि संदेश मिलता है।

समाधान onCreateDialog(int)

+0

हाय मैंड्रिक्स, मेरा वर्तमान लक्ष्य 8 है लेकिन मेरा विचलन 3 है। मैंने पोस्ट को अपने ऑनरेटियल (इंट) कार्यान्वयन के साथ अद्यतन किया है। धन्यवाद! – zegnus

4

लागू करने के लिए SDK संस्करण < 8 के लिए, यदि आप onCreateDialog में अशक्त लौट आप अपवाद java.lang.IllegalArgumentException मिलता है।

+0

ग्रेट, वह हो सकता है। मेरे संवाद संख्या 4 के अंदर, मेरे पास आंतरिक जांच थी और यदि यह विफल हो जाती है, तो यह शून्य हो जाएगी। मैं यह त्रुटि हो सकता है। हालांकि आधिकारिक दस्तावेज़ीकरण में, शून्य http://developer.android.com/guide/topics/ui/dialogs.html लौटने का विकल्प है, लेकिन मुझे लगता है कि समस्या यह है कि पहले, ऐप संवाद दिखाने में सक्षम था , तो उपयोगकर्ता किसी अन्य ऐप पर जाता है, और जब वह वापस आ जाता है, तो ऐप संवाद को पुनर्स्थापित करने का प्रयास करता है लेकिन इस बार शून्य हो जाता है। मैं इसे देख लूंगा, धन्यवाद! – zegnus

+1

यहां आप इसे देख सकते हैं http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/app/Activity.java#Activity.createDialog%28java .lang.Integer% 2Candroid.os.Bundle% 29। और इसे ठीक करने के लिए, आपको विधि विधि हटाने के लिए उपयोग विधि की आवश्यकता है, क्योंकि यह विधि mManagedDialogs से आपका संवाद हटा दें। – antslava

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