9

我試圖在我的android應用程序中更改選項菜單的背景顏色。我正在使用ActionBarSherlock庫。我曾嘗試這個代碼更改選項菜單java.lang.illegalstateexception:已在此layoutinflater上設置了一個工廠

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

但我結束了一個異常「java.lang.illegalstateexception:一個工廠已經設置在這個layoutinflater」的背景色以線

LayoutInflater.setFactory();

我不知道這段代碼有什麼問題。任何人都可以幫助我解決這個問題嗎?

回答

4

發生這種情況是因爲您正在使用兼容性庫。它設置自己的工廠來處理平臺特定的佈局。 在調用super.onCreate()之前,您可以嘗試在onCreate()方法中設置自己的工廠。這將禁止兼容性庫來覆蓋工廠,並且您將無法從xml文件中擴充碎片,但樣式應該可以工作。

5

爲了保持兼容性庫的正常工作並避免「java.lang.illegalstateexception:已在此layoutinflater上設置了一個工廠」,您需要獲取已設置的Factory的最終引用並在您的Factory中調用它的onCreateView。 onCreateView。在此之前,反省招必須要使用,讓您可以設定一個更多的時間一個工廠到LayoutInflater:

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:二進制XML文件行#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 22.1.0。

,如果你嘗試調用getLayoutInflater().setFactory()

您應該使用新的API

或者簡單地使用,你會得到一個IllegalStateException的舊版本

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

cud you pls分享一個工作代碼? – AndroidGuy

相關問題