2011-07-31 12 views
6

Pracuję nad aplikacją, która kieruje na API 11 (3.0), ale minSDKVersion to 7 (2.1).Refleksja jest niezbędna, jeśli używam "if (android.os.Build.VERSION.SDK_INT> = 11)"

Generuję program PreferenceActivity w sposób programistyczny, a nie XML. W Honeycomb, układy preferencji mają wbudowane miejsce na ikonę, która może przejść obok każdej preferencji. Możesz ustawić to za pomocą prefScreen.setIcon(R.drawable.my_icon);

Więc nie chcę tego robić w interfejsie API 7-10. Czy to wystarczająca ochrona przed awariami?

if (android.os.Build.VERSION.SDK_INT>=11) 
    prefScreen.setIcon(R.drawable.myIcon); 

Bardziej skomplikowane rozwiązanie, o którym wiem, że jest bezpieczne, to użycie refleksji w celu sprawdzenia, czy ta metoda istnieje przed próbą jej użycia.

Odpowiedz

10

Według http://developer.android.com/training/basics/activity-lifecycle/starting.html, to zakłada się, że jest to bezpieczne w użyciu stałej SDK_INT na Android 2.0 i powyżej, aby owinąć połączenia do nowszych API, bez używania refleksji.

Uwaga: Używanie SDK_INT aby zapobiec starszych systemu z wykonaniem nowe API działa w ten sposób na Androida 2.0 (poziom API 5) i wyższy tylko. Starsze wersje napotkają wyjątek środowiska wykonawczego.

+2

Przepraszam, jeśli po dwóch latach wrócisz złą postacią i zmienisz zaakceptowaną odpowiedź, ale ta odpowiedź jest teraz właściwa. Lint dostarcza ostrzeżeń, które pomogą ci uniknąć błędu podczas wywoływania niedostępnych metod. – Tenfour04

1

Jeśli metoda nie jest dostępna na niższym wersji platformy będzie katastrofy, gdy plik jest ładowany przez system (nie będzie nawet uczynić go do wykonania wyciągu if)

Powinieneś spojrzeć na artykuł na temat leniwy załadunku zrobić odbicie na Android Dev Blog

+0

Nie prawda ... to działa dobrze na moim telefonie z systemem 2.2. Nie jestem pewien, czy jest w 100% bezpieczny. Zajrzę do leniwego załadunku, dzięki. – Tenfour04

+0

Ciekawe, miałem wrażenie, że wszystkie metody zostały sprawdzone, gdy klasa została załadowana po raz pierwszy i uniemożliwiłaby działanie tego typu instrukcji "if". Tak czy inaczej, Lazy Loading jest lepszym sposobem radzenia sobie z tego typu niejasnościami w przypadku starszych wersji platformy. – smith324

+0

Tak, po przeczytaniu trochę więcej na ten temat, wygląda na to, że powinien on ulec awarii podczas ładowania klasy. Nie wiem, dlaczego tak się nie stało. – Tenfour04

2

Ten pracował dla mnie:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB){ 
      //code 
} 
Powiązane problemy