Co to jest za obiekt R i dlaczego R cannot be resolve

Gdy utworzymy w eclipse nowy projekt na androida, w głównej klasie zostanie wygenerowana metoda onCreate, która będzie wyglądała podobnie do tego co poniżej:

public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
}

Niepokoić może odwołanie do obiektu R i wyświetlany na starcie błąd R cannot be resolve. Kilka minut zajęło mi rozwiązanie tej zagadki, a więc teraz w kilka minut spróbuję napisać jej wyjaśnienie :)

Otóż, podczas budowania projektu, automatycznie w folderze gen/ tworzona jest klasa R, zawierające statyczne definicje wszystkich obiektów, które umieścimy w folderze res/. Ponieważ dopiero co utworzyliśmy nowy projekt, więc klasa R nie została jeszcze wygenerowana i stąd na ekranie widzimy błąd. Wystarczy jednak zbudować projekt i po problemie.

Do czego służy ta klasa? Otóż dzięki niej, możemy odwoływać się do obiektów umieszczonych w folderze res/. Dajmy na to, że do folderu res/drawable/ mamy wrzucony obrazek ball1.png – wtedy w klasie R zostanie utworzony odpowiedni wpis:

public final class R {
    public static final class drawable {
           public static final int ball1=0x7f020000;
    }
}

Teraz, aby użyć gdzieś w kodzie nasz obrazek, wystarczy odwołać się do obiektu R.drawable.ball1, np. w taki sposób:

ImageView i = new ImageView(this);
i.setImageResource(R.drawable.ball1);

No, to było takie wytłumaczenie totalnego laika dla laików :) Więcej o zasobach można poczytać pod adresem http://developer.android.com/guide/topics/resources/index.html oraz w dokumentacji http://developer.android.com/reference/android/content/res/package-summary.html.