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 🙂