2011-12-31 17 views
13

मैं नीचे दिए गए कोड के साथ AlertDialog बना रहा हूं। किसी कारण से मुझे हनीकॉम और ऊपर पर एक अतिरिक्त पृष्ठभूमि (तस्वीर देखें) मिल रही है। कोड क्रैश शहद के नीचे कुछ भी के लिए ठीक है। MyCustomDialog < एपीआई-11 और Theme.Holo.Dialog एपीआई-11 और ऊपर के लिए के लिए बस Theme.Dialog है।एंड्रॉइड अलर्ट संवाद पृष्ठभूमि समस्या API 11+

  1. कोई विचार क्यों मुझे अतिरिक्त पृष्ठभूमि मिल रही है?
  2. कोई विचार यह एपीआई < 11 के लिए क्यों दुर्घटनाग्रस्त है? अगर मैं थीम को हटा देता हूं तो यह ठीक काम करता है।

अद्यतन प्रश्न # 2 का उत्तर पता चला। लगता है निर्माता AlertDialog.Builder(Context context, int theme) एपीआई 11 में शुरू की गई थी मेरे ठीक लाइन के लिए बदलने के लिए बस गया था:

final AlertDialog.Builder builder = (Integer.parseInt(android.os.Build.VERSION.SDK) < 11)? new AlertDialog.Builder(this) : new AlertDialog.Builder(this,R.style.JumpDialog); 

मैं अभी भी प्रश्न # साथ मदद की जरूरत 1

enter image description here

private Dialog setupKeyBoardDialog() { 
    if (mContact.getLocaleId() != -1) { 
     final AlertDialog.Builder builder = new AlertDialog.Builder(this,R.style.MyCustomDialog); 
     builder.setTitle("Keyboards"); 

     mKeyboardLayouts = new KeyboardLayoutGroup(); 
     mKeyboardLayouts.layoutNames = new CharSequence[(int) jni.getNumKeyLayouts()]; 
     mKeyboardLayouts.layoutValue = new ArrayList<Integer>(); 

     for (int i = 0; i < jni.getNumKeyLayouts(); i++) { 
      mKeyboardLayouts.layoutNames[i] = jni.LayoutInfoForIndex(i).getName(); 
      mKeyboardLayouts.layoutValue.add(i, (int) jni.LayoutInfoForIndex(i).getLocale_id()); 
     } 

     final int selectedItem = mKeyboardLayouts.layoutValue.indexOf(mContact.getLocaleId()); 

     builder.setSingleChoiceItems(mKeyboardLayouts.layoutNames, selectedItem, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int item) { 
       mContact.setLocaleId(mKeyboardLayouts.layoutValue.get(item)); 
       mContactsDB.saveContact(mContact, true); 

       dialog.dismiss(); 
       initializeSettingsList(); 
      } 
     }); 

     final AlertDialog dialog = builder.create(); 
     dialog.setButton("Cancel", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialogBox, int arg1) { 
       dialogBox.cancel(); 
      } 
     }); 

     return dialog; 
    } 

    return null; 
} 

उत्तर

17

पता लगा उत्तर

  1. अलर्टडिअलॉग प्रत्येक विषय के लिए स्थिर स्थिरांक पर है अलर्टडिअलॉग कक्षा में और यह मानक थीम नहीं लेता है। जब R.style.MyTheme या android.R.style.Theme_Holo_Dialog AlertDialog.THEME_HOLO_LIGHT के साथ प्रतिस्थापित किया गया तो कोड ठीक काम करता था।
  2. लगता है निर्माता AlertDialog.Builder(Context context, int theme) एपीआई 11 में शुरू की गई थी मेरे ठीक बस था लाइन बदलने के लिए:

    final AlertDialog.Builder builder; 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { 
        builder = new AlertDialog.Builder(this); 
    } else { 
        builder = new AlertDialog.Builder(this,R.style.JumpDialog); 
    } 
    
+0

, आप Build.VERSION.SDK_INT बजाय का उपयोग करना चाहिए क्योंकि Build.VERSION.SDK मान्य नहीं है। – bCliks

+0

ने बहिष्कृत एपीआई और हार्डकोडेड एपीआई स्तर – Ali

+0

को हटाने के उत्तर को अपडेट किया है, इसलिए अब "Integer.parseInt" की आवश्यकता नहीं है –

6

आप new AlertDialog.Builder(this, R.style.JumpDialog)

2

उन लोगों के लिए के बजाय new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.JumpDialog)) उपयोग करने के लिए कोशिश कर सकते हैं लॉलीपॉप से ​​शुरू होने वाले डिफ़ॉल्ट लोगों (स्वीकार्य समाधान में) के साथ चिपकने के बिना संवाद विषय को अनुकूलित करने का एक तरीका ढूंढना ऐसा लगता है कि अतिरिक्त पृष्ठभूमि को अंत में हटा दिया गया है। तो, अब आप डिफ़ॉल्ट एक (AppCompat साथ उदाहरण) से इनहेरिट एक विषय बना सकते हैं:

<!-- default theme for L devices --> 
<style name="SelectionDialog" parent="Theme.AppCompat.Light.Dialog"> 
    <item name="android:textColor">@color/default_text_color_holo_light</item> 
</style> 
<!-- theme for Pre-L devices --> 
<style name="SelectionDialog.PreL"> 
    <!-- remove the dialog window background --> 
    <item name="android:windowBackground">@color/transparent</item> 
</style> 

और इस कोड के साथ अपने बिल्डर का दृष्टांत:

AlertDialog.Builder builder = new AlertDialog.Builder(
      getActivity(),     
      Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT ? 
        R.style.SelectionDialog : 
        R.style.SelectionDialog_PreL); 
पाठ्यक्रम इसमें से

भी संसाधन के साथ किया जा सकता है फ़ोल्डर (values/ और values-v21/)।

1.6 से पर
संबंधित मुद्दे