2013-04-04 23 views
5

Zdaję sobie sprawę, na Context.getTheme(), to zazwyczaj nie działa dobrze, jeśli używamy Application jako ContextDlaczego getTheme nie działa dobrze na zgłoszeniu

MyApplication.singletonInstance().getTheme().resolveAttribute(R.attr.actionBarDeleteIcon, typedValue, true); 
// typedValue.resourceId will be 0x0, which is invalid 

Jednakże, jeśli mogę użyć Activity jako kontekst, to działa dobrze

MyFragment.this.getActivity().getTheme().resolveAttribute(R.attr.actionBarDeleteIcon, typedValue, true); 
// typedValue.resourceId is valid 

Zastanawiam się, dlaczego nie możemy rozwiązać atrybut przez Application?

W manifeście określone informacje na temat tematu znajdują się na poziomie Application. Pomyślałem, że uzyskanie motywu z obiektu Application ma sens.

<application 
    android:theme="..." 

Odpowiedz

3

To nie działa, ponieważ najwyraźniej obiekt zwrócony przez getApplicationContext() nie jest kompletnym Context przedmiot, jak zauważono in this answer by CommonsWare:

To nie jest kompletna Context, wspieranie wszystko, Activity robi. Różne rzeczy, które spróbujesz zrobić z tym Context, zawiodą, głównie z GUI.

Jednym z możliwych rozwiązań jest ręcznie ustawić motyw na tej Context, tak:

getApplicationContext().getTheme().applyStyle(R.style.MyTheme, true); 

Ale ta metoda nie jest zatwierdzony przez zespół Android dev; właściwym rozwiązaniem jest użycie Activity dla rzeczy związanych z interfejsem użytkownika, takich jak getTheme().

Powiązane problemy