LinearLayout Children

  • 4 Antworten
  • Letztes Antwortdatum
L

LoLmAnxD1998

Ambitioniertes Mitglied
0
Hallo Comunity,

Ich habe in meiner App ein LinearLayout indem sich weitere LinearLayouts und ImageButtons befinden. Ich versuche jetzt mit folgendem Code die ImageResourcen der einzelnen Buttons zu ändern:

Code:
int nummer = 0;
		LinearLayout mainLayout = (LinearLayout) findViewById(R.id.mainLayout);
		while (nummer < mainLayout.getChildCount()){
			ImageButton button = (ImageButton)mainLayout.getChildAt(nummer);
			int type = (Integer) button.getTag(R.id.ctype);
			
			if (type == 1){
				button.setImageResource(R.drawable.img_1);
			} 
			if (type == 2){
				button.setImageResource(R.drawable.img_2);
			}
		}

Leider funktioniert das nicht, da sich auch die anderen Layouts darin befinden und die sich logischer weise nicht zu ImageButtons casten lassen. Hat jemand eine Idee wie ich das machen kann ? Hier mein Layout XML:

Code:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:weightSum="6"
    android:id="@+id/mainLayout" >

    
         <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:weightSum="3" >

             <ImageButton
                 android:id="@+id/imageButton1"
                 android:layout_width="wrap_content"
                 android:layout_height="match_parent"
                 android:src="@drawable/ic_launcher"
                 android:layout_weight="1" />
              <ImageButton
                 android:id="@+id/imageButton2"
                 android:layout_width="wrap_content"
                 android:layout_height="match_parent"
                 android:src="@drawable/ic_launcher"
                 android:layout_weight="1" />
               <ImageButton
                 android:id="@+id/imageButton3"
                 android:layout_width="wrap_content"
                 android:layout_height="match_parent"
                 android:src="@drawable/ic_launcher"
                 android:layout_weight="1" />

    </LinearLayout>
     <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
         android:weightSum="3" >
                <ImageButton
                 android:id="@+id/imageButton4"
                 android:layout_width="wrap_content"
                 android:layout_height="match_parent"
                 android:src="@drawable/ic_launcher"
                 android:layout_weight="1" />
                 <ImageButton
                 android:id="@+id/imageButton5"
                 android:layout_width="wrap_content"
                 android:layout_height="match_parent"
                 android:src="@drawable/ic_launcher"
                 android:layout_weight="1" />
                  <ImageButton
                 android:id="@+id/imageButton6"
                 android:layout_width="wrap_content"
                 android:layout_height="match_parent"
                 android:src="@drawable/ic_launcher"
                 android:layout_weight="1" />
    </LinearLayout>
     <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:layout_weight="1"
         android:weightSum="3" >
                   <ImageButton
                 android:id="@+id/imageButton7"
                 android:layout_width="wrap_content"
                 android:layout_height="match_parent"
                 android:src="@drawable/ic_launcher"
                 android:layout_weight="1" />
                    <ImageButton
                 android:id="@+id/imageButton8"
                 android:layout_width="wrap_content"
                 android:layout_height="match_parent"
                 android:src="@drawable/ic_launcher"
                 android:layout_weight="1" />
                     <ImageButton
                 android:id="@+id/imageButton9"
                 android:layout_width="wrap_content"
                 android:layout_height="match_parent"
                 android:src="@drawable/ic_launcher"
                 android:layout_weight="1" />
    </LinearLayout>

     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_weight="1" >
     </LinearLayout>

</LinearLayout>
 
Sicher, dass getChildCount() hier richtig gewählt ist?
Ich habe mit den diesen Methoden ehrlich gesagt noch nicht gearbeitet, aber vielleicht ist das ja (mit) eine Fehlerquelle.
Kannst diesen Beitrag ja noch mal checken: java - Android: Difference between getCount() and getChildCount() in ListView - Stack Overflow
Mit Logcat kannst du gut prüfen, ob die Anzahl der Elemente, die du mit der Funktion ansprechen willst, stimmt.

Warum willst du überhaupt über eine Schleife die Ressourcen setzen? So viele Ressourcen sind es ja scheinbar nicht, die du "händisch laden" müsstest?
Meiner Meinung nach sind das unnötige Fehlerquellen (aber das ist natürlich auch eine Frage des persönlichen Stils).
 
Leider funktioniert das nicht, da sich auch die anderen Layouts darin befinden und die sich logischer weise nicht zu ImageButtons casten lassen. Hat jemand eine Idee wie ich das machen kann ?
Vor dem Casten überprüfen ob es sich um einen ImageButton handelt. Das geht mit dem instanceof Operator.

In deinem Code sehe ich, dass du getChildAt auf mainLayout aufrufst, die Buttons aber nicht direkte Kinder von mainLayout sind. Bist du dir sicher, dass du so auch auf Kinder von Kindern zugreifen kannst? Ich habe jetzt nicht in der API nachgesehen, aber vom Gefühl her würde ich sagen, dass nur die direkten Kinder so zugreifbar sind.
 
Würde ich ebenfalls so sehen. Zur Laufzeit kennt ein Fenster sicherlich nur seine unmittelbaren 'Kinder', nicht jedoch die Enkel etc.
Versuche doch mal über das mainLayout, den View zu ziehen, der die Buttons beinhaltet, und auf diesem dann wiederum mit getChild... die Buttons zu referenzieren. Das sollte dann eigentlich so funktionieren?! Habe ich aber offengestanden ebenfalls nicht nachgeschlagen, sondern ist so eine mehr spontane Eingebung dazu... :unsure:

ps. Solange Du mit 'if(...) {...}' ohne default Fall (else) an deinem 'setImageResource(...)' vorbei läufst, was richtiger Weise unsichtbar bleibt, ist so ein Fehler natürlich schwer zu finden.
 
Zuletzt bearbeitet von einem Moderator:
Android | Get all children elements of a ViewGroup - Stack Overflow

Das dürfte Dir helfen. Deine ImageViews befinden sich in einer Viewgroup (LinearLayout) die sich in einer zweiten ViewGroup (LinearLayout) befinden. Mit deiner Methode findest du nur das LinearLayout, das ein Child deines MainLayout ist.

In der ArrayList des Beispiels befinden sich alle Views, mit instanceof kannst du dann alle ImageButton finden.
 
Zurück
Oben Unten