2011-01-11 9 views
13

मैं एक संपादन संवाद युक्त एक कस्टम संवाद बना रहा हूं ताकि मैं उपयोगकर्ता से टेक्स्ट डेटा प्राप्त कर सकूं:संवाद समस्या: सामग्री जोड़ने से पहले अनुरोध फ़ीचर() को कॉल किया जाना चाहिए

final EditText newKey = (EditText) findViewById(R.id.dialog_result); 
AlertDialog.Builder keyBuilder = new AlertDialog.Builder(StegDroid.this); 
keyBuilder 
.setCancelable(false) 
.setPositiveButton("Try Again", new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int id) { 
     Log.v("Dialog","New Key: "+newKey.getText().toString()); 
    } 
}) 
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) { 
      dialog.cancel(); 
     } 
    }); 
AlertDialog dialog = keyBuilder.create(); 
dialog.setTitle("Decryption Failed"); 
dialog.setContentView(R.layout.decrypt_failed_dialog); 
dialog.show(); 

हालांकि मुझे हमेशा यह अपवाद मिलता है:

01-11 18:49:00.507: ERROR/AndroidRuntime(3461): android.util.AndroidRuntimeException: requestFeature() must be called before adding content 
01-11 18:49:00.507: ERROR/AndroidRuntime(3461):  at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:181) 
01-11 18:49:00.507: ERROR/AndroidRuntime(3461):  at com.android.internal.app.AlertController.installContent(AlertController.java:199) 
01-11 18:49:00.507: ERROR/AndroidRuntime(3461):  at android.app.AlertDialog.onCreate(AlertDialog.java:251) 

... 

dialog.show() की रेखा पर। इससे छुटकारा पाने के लिए मुझे क्या करना चाहिए?

उत्तर

34

आपको संवाद बनाने से पहले कस्टम दृश्य सेट करने की आवश्यकता है। setContentView() के बजाय आपको setView(View) का उपयोग करने की आवश्यकता है यदि आप AlertDialog द्वारा आपके लिए प्रदान किए गए डिफ़ॉल्ट सकारात्मक और नकारात्मक बटन का उपयोग कर रहे हैं।

final EditText newKey = (EditText) findViewById(R.id.dialog_result); 
AlertDialog.Builder keyBuilder = new AlertDialog.Builder(StegDroid.this); 
keyBuilder 
.setCancelable(false) 
.setPositiveButton("Try Again", new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int id) { 
     Log.v("Dialog","New Key: "+newKey.getText().toString()); 
    } 
}) 
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) { 
      dialog.cancel(); 
     } 
    }); 
keyBuilder.setTitle("Decryption Failed"); 
keyBuilder.setView(getLayoutInflater().inflate(R.layout.decrypt_failed_dialog, null)); 
AlertDialog dialog = keyBuilder.create(); 
dialog.show(); 
+2

कोई टिप्पणी जोड़ना अच्छा लगेगा ताकि कोई और आसानी से पता लगा सके कि कोड की तुलना किए बिना अलग-अलग क्या किया गया था। – codinguser

+0

आप सही दोस्त हैं ... मेरे पास अभी कोई समय नहीं है। क्या आप इसे अधिक सटीक बनाने के लिए उत्तर संपादित करना चाहते हैं? – Cristian

+3

धन्यवाद! आपने अपना दिन बचाया "... आपको setContentView() के बजाय setView (देखें) का उपयोग करने की आवश्यकता है ..." :) –

4

यह भी सुनिश्चित करें कि आप पहले से दिखाए गए संवाद को वापस नहीं कर रहे हैं। उदाहरण के लिए, ProgressDialog में एक आसान स्थिर विधि show() है जो कुछ पैरामीटर लेता है और ProgressDialog देता है। बाहर निकलता है कि आप उस विधि का उपयोग नहीं कर सकते हैं और परिणामी ProgressDialog वापस कर सकते हैं, क्योंकि तब जब ओएस इसे दिखाने की कोशिश करता है (और यह पहले से दिखाया गया है), तो यह वही अपवाद फेंक देगा।

सावधान रहें: उपर्युक्त व्यवहार एंड्रॉइड एमुलेटर पर अनुभव किया जाता है, लेकिन वास्तव में यह एक अपवाद नहीं फेंक दिया और मेरे Droid Incredible 2.2 पर ठीक काम करता है।

2

मुझे एक ही समस्या थी। लेकिन मेरा संवाद आईएमई के लिए प्रदर्शित किया जाना था। जब मैंने AlertDialog के बजाय संवाद में स्विच किया, और छोड़ा गया, कार्यक्रम मेरे लिए काम किया।

-3

इस समस्या को हल करने के लिए सटीक तरीका:

requestFeature(int)Window की एक विधि है। आपको इस कक्षा को आयात करना होगा (android.view.Window)।

और आपको AlertDialog.Builder ऑब्जेक्ट की विंडो प्राप्त करनी है। फिर requestFeature(int) पर कॉल करें। इनपुट पैरामीटर विंडो की स्थिरता है।

keyBuilder.getWindow().requestFeature(Window.FEATURE_ACTION_BAR);

4

मैं एक साल पहले के बारे में इस में पड़ गए और एक तरह से अजीब कोड का उपयोग कर में यह तय कर लिया है। दोबारा, जिस ऐप पर मैं काम कर रहा हूं वह एक टुकड़ा है जो सामान्य रूप से फोन पर प्रदर्शित होना चाहिए, लेकिन टैबलेट पर एक संवाद में। मैं इसे इस तरह हल:

public class MyDialogFragment extends DialogFragment { 
    private View mLayout; 
    private ViewGroup mContainer; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     mContainer = container; 
     if (getShowsDialog()) { 
      // one could return null here, or be nice and call super() 
      return super.onCreateView(inflater, container, savedInstanceState); 
     } 
     return getLayout(inflater, container); 
    } 

    private View getLayout(LayoutInflater inflater, ViewGroup container) { 
     mLayout = inflater.inflate(R.layout.my_layout, container, false); 
     return mLayout; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     return new AlertDialog.Builder(getContext()) 
       .setPositiveButton(R.string.ok, null) 
       .setNegativeButton(R.string.cancel, null) 
       .setNeutralButton(R.string.filter_clear_selection, null) 
       .setView(getLayout(LayoutInflater.from(getContext()), mContainer)) 
       .create() 
      ; 
    } 
} 

यह मैं किसी भी सामान्य टुकड़ा (एक लेआउट में) के रूप में मेरे टुकड़ा जोड़ने के लिए, लेकिन यह भी एक संवाद है जहाँ यह स्वायत्त चलाता है के रूप में प्रदर्शित की अनुमति देता है।

3

उन लोगों के लिए जो DialogFragment का उपयोग करते समय विशेष रूप से इस समस्या का सामना कर रहे हैं।

मेरे मामले में, ऐसा इसलिए हुआ क्योंकि मैं DialogFragment कक्षा को गलत तरीके से विस्तारित कर रहा था। मैं onCreateView() पर एक दृश्य वापस कर रहा था और onCreateDialog() पर एक कस्टम संवाद लौट रहा हूं।प्रलेखन राज्यों:

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

हालांकि, आप इस मामले में संवाद बनाने के लिए पर AlertDialog.builder या अन्य संवाद ऑब्जेक्ट्स का उपयोग नहीं कर सकते हैं। यदि आप डायलॉगफ्रैगमेंट एम्बेड करने योग्य होना चाहते हैं, तो आपको लेआउट में डायलॉग के यूआई को परिभाषित करना होगा, फिर ऑनक्रेट व्यू() कॉलबैक में लेआउट लोड करना होगा।

onCreateDialog() पर कुछ भी नहीं बनाकर समस्या हल हो गई (केवल सुपरक्लास कार्यान्वयन को वापस कर रहा है)।

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

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