2017-02-21 29 views
6

Używam butterknife przez kilka miesięcy, a ja po prostu zauważyłem w jego dokumentacji, że mówi:Android: Dlaczego musimy używać R2 zamiast R z nożem?

Teraz upewnij się, że używasz R2 zamiast R wewnątrz wszystkich Butter Knife adnotacji.

Dlaczego tak jest? Używam R i wszystko działa idealnie.

+1

Zauważyłem, że wartość ids w R2 dla dowolnego res (kolor, dimen, ...) jest taka sama jak w R. Jedyną różnicą w R2 jest adnotacja typu "@DrawableRes "i" @IdRes "i użył tej adnotacji, aby upewnić się, że zwracasz poprawny i oczekiwany typ. na przykład wartość zwracana "@ ColourRes" powinna być referencją do zasobu kolorystycznego, a wartość zwracana "@DrawableRes" powinna być odniesieniem do zasobów do rysowania. – Sally

+0

@Sally Więc mówisz, że jeśli użyję R2, otrzymam błędy czasu kompilacji na wypadek, gdy spróbuję powiązać id z niewłaściwym typem? – TheCrafter

+0

Wyłączyłem to, adnotacje pomogły nam ulepszyć kontrolę kodu https://developer.android.com/studio/write/annotations.html – Sally

Odpowiedz

9

Używanie R2 jest potrzebne tylko do budowania projektów biblioteki Android.

https://github.com/JakeWharton/butterknife#library-projects

Ma to związek z faktem, że wartości w R.java generowanej klasy nie są zadeklarowane jako „ostateczny”, kiedy zbudowany jako część biblioteki. Adnotacje użyte do @BindView() potrzebują tych wartości R., aby były ostateczne i nie mogą być później zmieniane.

Jestem pewna, że ​​ktoś mógłby wyjaśnić wszystko lepiej - ale najważniejsze jest to - po prostu dobrze jest używać "R." wartości w @BindView w aplikacji Android

+0

OK, mam to teraz. Dzięki! – TheCrafter

+0

Dla nieco dalszych wyjaśnień, mam odpowiedź tutaj https://stackoverflow.com/questions/48577106/final-field-in-r2-java-in-butterknife/ – Debdeep