9

पर एक कारखाना पहले ही सेट हो चुका है मैंने अपने एंड्रॉइड ऐप में विकल्प मेनू के पृष्ठभूमि रंग को बदलने की कोशिश की है। मैं एक्शनबार शेरलॉक लाइब्रेरी का उपयोग कर रहा हूं। लाइनjava.lang.illegalstateexception: इस लेआउटइनफ्लेटर

पर: मैं

https://stackoverflow.com/a/8475357/584095

लेकिन मैं एक अपवाद "एक कारखाने पहले से ही इस layoutinflater पर स्थापित किया गया है java.lang.illegalstateexception" के साथ समाप्त हो गया विकल्प मेनू की पृष्ठभूमि का रंग बदलने के लिए इस कोड की कोशिश की है

LayoutInflater.setFactory();

मुझे नहीं पता कि इस कोड में क्या गलत है। क्या कोई इस मुद्दे को हल करने में मेरी मदद कर सकता है?

उत्तर

4

ऐसा इसलिए होता है क्योंकि आप संगतता लाइब्रेरी का उपयोग कर रहे हैं। यह मंच विशिष्ट लेआउट से निपटने के लिए अपनी फैक्टरी सेट करता है। आप super.onCreate() को कॉल करने से पहले अपने कारखाने को ऑनरेट() विधि में सेट करने का प्रयास कर सकते हैं। यह फैक्ट्री को ओवरराइड करने के लिए संगतता लाइब्रेरी को अस्वीकार कर देगा और आप एक्सएमएल फाइलों से टुकड़े को बढ़ाने में असमर्थ होंगे, लेकिन स्टाइल को काम करना चाहिए।

5

संगतता पुस्तकालय काम कर रखने के लिए और से बचने के लिए "java.lang.illegalstateexception: एक कारखाने पहले से ही इस layoutinflater पर स्थापित किया गया है", तो आप पहले से ही सेट फैक्टरी के लिए एक अंतिम संदर्भ मिलता है और अपने खुद के फैक्टरी के भीतर अपनी onCreateView कॉल करने के लिए की जरूरत है। onCreateView।

LayoutInflater layoutInflater = getLayoutInflater(); 
final Factory existingFactory = layoutInflater.getFactory(); 
// use introspection to allow a new Factory to be set 
try { 
    Field field = LayoutInflater.class.getDeclaredField("mFactorySet"); 
    field.setAccessible(true); 
    field.setBoolean(layoutInflater, false); 
    getLayoutInflater().setFactory(new Factory() { 
     @Override 
     public View onCreateView(String name, final Context context, AttributeSet attrs) { 
      View view = null; 
      // if a factory was already set, we use the returned view 
      if (existingFactory != null) { 
       view = existingFactory.onCreateView(name, context, attrs); 
      } 
      // do whatever you want with the null or non-null view 
      // such as expanding 'IconMenuItemView' and changing its style 
      // or anything else... 
      // and return the view 
      return view; 
     } 
    }); 
} catch (NoSuchFieldException e) { 
    // ... 
} catch (IllegalArgumentException e) { 
    // ... 
} catch (IllegalAccessException e) { 
    // ... 
} 
+1

काम नहीं करता। फेंकना "android.view.InflateException: बाइनरी एक्सएमएल फ़ाइल लाइन # 17: वर्ग com.android.internal.view.menu.ActionMenuItemView को बढ़ाने में त्रुटि" – MSIslam

+0

वास्तव में कोई और अपवाद नहीं फेंक दिया गया है, लेकिन मेरा टेक्स्ट रंग अभी भी भूरा है :( –

2

यह मेरे लिए काम करता है::

LayoutInflater inflater = LayoutInflater.from(context); 
if (inflater.getFactory() != null) { 
    inflater = inflater.cloneInContext(context); 
} 
inflater.setFactory(factory); 
6

वहाँ समर्थन पुस्तकालय में एक change संस्करण बाद से किया गया इससे पहले कि एक आत्मनिरीक्षण चाल होना चाहिए आप एक बार और LayoutInflater करने के लिए एक फैक्टरी स्थापित करने के लिए अनुमति देने के लिए उपयोग 22.1.0।

अगर आप आप नए एपीआई

या बस का उपयोग getLayoutInflater().setFactory()

कॉल करने के लिए, तो आपको एक IllegalStateException मिल जाएगा पुराना संस्करण

  • com.android.support:appcompat-v7:22.0.0
  • com.android.support:appcompat-v4:22.0.0
+0

cud you pls एक कामकाजी कोड साझा करें? – AndroidGuy

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