findViewById w pętli for

Podczas tworzenia aplikacji na system Android korzystamy z wielu kontrolek typu Button, TextView itd. którymi musimy zarządzać.  Wyobraźmy sobie taką sytuację, że mamy ekran ustawień a w nim znajduje się 10 kontrolek typu ToggleButton. Aby pobrać do nich referencje musimy skorzystać z metody findViewById. W „klasycznym” wykonaniu zrobimy coś takiego:

ToggleButton bt = (ToggleButton) findViewById(R.id.button1);

i tak razy 10. Sporo tego kodu. Dlatego w tym w tym wpisie przedstawie Ci inne rozwiązanie w jaki sposób możesz pobierać referencję do tych kontrolek za pomocą metody findviewbyid w pętli for.

1. Wygląd layoutu

Poglądowy nasz plik z layoutem będzie następujący:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ToggleButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/button1"
        />
    <ToggleButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/button2"
        />
   ...
    <ToggleButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/button9"
        />
    <ToggleButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/button10"
        />
</LinearLayout>

2. Plik Activity

W pliku activity dodajemy następujący kod:

ToggleButton button = new ToggleButton[10];
for(int i=0; i<button.length; i++) {
        String buttonID = "button" + (i+1);
        int resID = getResources().getIdentifier(buttonID, "id", getPackageName());
        button[i] = ((ToggleButton) findViewById(resID));
}

I oto cała pętla, która mieście sie 6 linijkach zamiast w 10 (w naszym przykładzie). Nie przeszkadza to aby każdy button nadsłuchiwał np:

Day_button[i].setOnCheckedChangeListener(listener);

Takie rozwiązanie możemy stosować do wielu typów kontrolek np: EditText itp.

3. Podsumowanie

Oczywiście takie rozwiązanie ma swoje plusy i minusy. Plus jest taki, że mało kodu. Minus taki, że dłużej wykonuje się taki kod. W teście który przeprowadziłem kod w tradycyjny sposób wykonuje się około ~40 mikrosekund czyli 0,04 ms. Natomiast kod w pętli ~300 mikrosekund czyli 0,3 ms. Dlatego traktuj ten wpis jako ciekawostkę oraz uważnie stosuj to rozwiązanie, a także przeprowadzaj wcześniej testy 🙂

Co dalej?

  • Polub stronę MYENV na Facebooku oraz śledź mnie na Twitterze
  • Zachęcam do komentowania i pisania propozycji tematów, o których chcesz przeczytać
  • Poleć ten wpis za pomocą poniższych przycisków. Będę Ci za to bardzo wdzięczny 🙂
  • Życzę Ci miłego dnia i miłego kodowania 🙂