# Dynamische (Image)Buttons, Größe bestimmen



## kuzdu (21. Mai 2014)

Hallo Leute,

ich wühle mich jetzt schon einige Zeit durchs Internet und finde auf mein Problem keine Lösung. Und zwar soll meine App schön aussehen, weshalb ich Grafiken habe. Auf einer Seite werden zahlreiche Buttons ausgelesen und dementsprechend nicht im .xml-Layout erstellt sondern dynamisch im Code. Diese Buttons sollen eine bestimmte Größe haben, aber genau da liegt das Problem, ich bekomme sie einfach nicht skaliert.

Mein Code sieht wie folgt aus: 


```
Button[] b_test  = new Button[100];
       b_test[1] = new Button(this);
       b_test[1].setId(1);
      
        b_test[1].setBackgroundDrawable(getResources().getDrawable(R.drawable.menubutton));
        b_test[1].setText("Button eins");

//wird einfach ignoriert
        b_test[1].setMaxWidth(buttonsize);
        b_test[1].setMaxHeight(buttonsize);
        b_test[1].setHeight(buttonsize);
        b_test[1].setWidth(buttonsize);


//Irgendwo gelesen, dass man setScaleX/Y benutzen soll, das wirft allerdings ein NoSuchMethode-Exception 
//        b_test[1].setScaleX(10);
//        b_test[1].setScaleY(10);

     
        //Positionierung des Buttons
        lpTest[1] = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
        lpTest[1].addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        rLayout.addView(b_test[1], lpTest[1]);
```

Ohne das Hintergrundbild ist es überhaupt kein Problem, die Größe zu verstellen. 
Ich habe es auch schon mit einem ImageButton versucht, aber der hat mir setWidth/setHeight nicht einmal angeboten.

Morgen schaue ich mal wie das ganze mit ImageView aussieht, aber ich kann mir eigentlich nicht vorstellen, dass das der richtige Weg ist oder? Ich meine, warum sollte ich - falls überhaupt möglich -  das Ganze per ImageView realisieren, wenn es (Images)Buttons gibt? 

Ich finde zwar zahlreiche Themen im Internet dazu, aber meistens haben die Ersteller xml-Code. Hatte jemand vielleicht von euch schon das Problem? Ich wäre um jeden Rat sehr dankbar... 

Gudde Nacht


----------



## dzim (21. Mai 2014)

Ich mache eigentlich auch nichts mehr direkt per Code. Und wenn, dann lege ich mir kleinere Layouts an, die ich per Inflater lade. Ich versuche eigentlich immer, alles per XML zu erledigen.

Ich verstehe das Problem tatsächlich noch nicht ganz, habe bei mir aber auch herunterskalierte ImageViews für einen aktuellen kleineren Auftrag. Dort mache ich es so:
[XML]
            <ImageView
                android:id="@+id/fragment_info_smiley"
                android:layout_width="150dp"
                android:layout_height="150dp"
                android:layout_gravity="center_vertical"
                android:contentDescription="@string/fragment_info_smileyContentDescr"
                android:scaleType="fitCenter"
                android:src="@drawable/empty" />
[/XML]

Ich habe jetzt hier schon die Grösse quas fix vorgegeben. Das ist für mich ok, weil ich gezielt für ein Gerät entwickle, du aber müsstest hier vermutlich (im Code) an den LayoutParams noch schrauben. Wichtig ist noch das Attribut scaleType, sonst wird dein Bild vielleicht noch abgeschnitten oder so.


----------



## kuzdu (21. Mai 2014)

Hey,

danke für die schnelle Antwort. Ich bin leider noch nicht dazu gekommen, aber werde mal nach Inflater googlen. Ich werde mal versuchen deinen XML-Code per Java zu erstellen.

Um das Problem noch mal genauer zu beschreiben: 
Die Situation ist, dass ich x Kategorien habe und jede Kategorie wird über einen Button angesprochen. Das x wird stetig mit der Zeit wachsen, da die App mit Kategorien inhaltlich immer erweitert wird. Deshalb fragt die App bei jedem Start eine Onlinedatenbank an, ob Kategorien dazugekommen sind. Wenn ja, werden diese auf dem Handy in eine SQLite-Datenbank geschrieben. 
Aus dieser Datenbank werden dann x Buttons erzeugt. 

Beim XML-Layout müsste ich immer einen Button per Hand einfügen und zusätzlich müsste der Benutzer jedes Mal seine App updaten. 
Das ist der Grund, warum ich den Code per Java deklariere und nicht per XML. Ansonsten bevorzuge ich auch das XML.

Ich hoffe, das Problem ist klarer geworden? 

---
Allgemein gefragt (habe danach jetzt noch nicht gegoogelt): Wie realisiert/organisiert man das Layout, dass es auf allen Geräten möglichst gleich aussieht. Vielleicht hat jmd. ja schon im Vorfeld einen guten Tipp.

Ich versuche jetzt mal das ganze per ImageView zu realisieren.

Gruß


----------



## dzim (22. Mai 2014)

Der schnellste Weg zum LayoutInflater ist *LayoutInflater.from(<context>)*.

Was deine Buttons angeht... Warum verwendest du dann nicht eine Liste? Das wäre weitaus sinnvoller in dem Scenario, denn du könntest dann einfach einen SimpleCursorAdapter ("Cursor", wie bei den SQLite Operationen üblich...) erweitern und damit die Liste befüllen lassen. Nur so als Idee.


----------



## kuzdu (27. Mai 2014)

Hey, 
für Leute, die hier vielleicht noch drüber stolpern:

Ich habe es mit Hilfe dieses Videos gelöst: https://www.youtube.com/watch?v=4MFzuP1F-xQ

Und dem Befehl:


```
Button btn = new Button(this);
btn.getLayoutParams().height = 120; //Hier beliebige Höhe eintragen
```

Allgemein gilt zu sagen, dass ich mich nicht für ImageButton und ImageView entschieden habe, da ich es nicht hinbekommen habe diese zusätzlich auch noch zu beschriften. Beim Button konnte ich ein Background sowie setText() benutzen.

Ich frage mich jetzt noch, wie ich die Buttons so anpassen kann, dass sie auf auf jedem Androidgerät die entsprechend gleiche Größe haben und nicht kleiner/größer wirken, nur weil das Display/die Auflösung anders ist als bei meinem Testgerät. Aber an sich ist der Thread gelöst.  Danke an alle!


----------

