9

Próbowałem zmienić kolor tła menu opcji w mojej aplikacji na Androida. Używam biblioteki ActionBarSherlock. Próbowałem ten kod do zmiany koloru tła menu opcjijava.lang.illegalstateexception: fabryka została już ustawiona na tym layoucie na

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

Ale skończyło się wyjątek „java.lang.IllegalStateException: fabryka została już ustawiona na tej layoutinflater” na linii

LayoutInflater.setFactory();

Nie wiem, co jest nie tak w tym kodzie. Czy ktoś może mi pomóc w rozwiązaniu tego problemu?

Odpowiedz

4

Dzieje się tak, ponieważ używasz biblioteki zgodności. Ustawia własną Fabrykę, aby zajmować się układami specyficznymi dla platformy. Możesz spróbować ustawić własną fabrykę w onCreate() przed wywołaniem super.onCreate(). To uniemożliwi bibliotekę kompatybilności, aby zastąpić fabrykę, i nie będziesz w stanie nadmuchać fragmentów z plików xml, ale stylizacja powinna działać.

5

Aby biblioteka kompatybilności działała i uniknęła "java.lang.illegalstateexception: fabryka została już ustawiona na tym layoucie", musisz uzyskać ostateczne odwołanie do już ustawionej Fabryki i wywołać jej naCreateView w swojej własnej Fabryce. onCreateView. Przed że introspekcja trik musi być użyty, aby umożliwić Ci ustawić jeszcze raz fabrykę do 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

nie działa. Rzucanie "android.view.InflateException: Binarna linia pliku XML nr 17: Błąd podczas nadawania klasy com.android.internal.view.menu.ActionMenuItemView" – MSIslam

+0

właściwie nie jest już zgłaszanego wyjątku, ale mój kolor tekstu jest nadal szary: ( –

2

Działa to dla mnie:

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

Nie było change w bibliotece wsparcia od wersji 22.1.0.

Dostaniesz IllegalStateException jeśli spróbujesz zadzwonić getLayoutInflater().setFactory()

Należy użyć nowego API

Albo po prostu użyć stara wersja

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

cud ci udostępniać działający kod? – AndroidGuy

Powiązane problemy