Neuen Button erzeugen und ein Style anwenden

  • Antworten:8
Rainu
  • Forum-Beiträge: 42

18.05.2012, 12:23:37 via Website

Hallo,

ich möchte gern programatisch einen Button (o.ä.) erzeugen, den ich dann ein Style zuweise (wenn das so richtig formuliert ist). Dieser Style ist vorher fest in einer XML-Datei geschrieben wurden (und liegt unter res/values/styles.xml).

Geht das überhaupt?

Antworten
Rainu
  • Forum-Beiträge: 42

18.05.2012, 15:10:37 via Website

Wäre es denn denkbar, dass man sich ein "Button-Prototyp" erstellen lässt und diesen anschließend kopiert? Dann könnte ich nehmlich einen Block per XML stylen und dann programatisch vervielfältigen...

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

18.05.2012, 16:16:20 via App

Hey,
das geht über den LayoutInflater.
Lg Ansgar

Antworten
Rainu
  • Forum-Beiträge: 42

18.05.2012, 21:05:08 via Website

Also meine Versuche enden leider immer in Exceptions :(

1View btn= layoutInflater.inflate(R.layout.templates, null).findViewById(R.id.template_button);

Damit bekomm ich zwar den Button. Versuch ich ihn jedoch an verschiedenen Stellen einzufügen, bekomm ich eine Exception, die besagt, dass ich dieses Element nicht an verschiedenen Parents heften kann.

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

18.05.2012, 21:09:13 via App

Weil du ihn mehrfach brauchst..
Mehrmals inflaten.. :)
Lg Ansgar

Antworten
Rainu
  • Forum-Beiträge: 42

18.05.2012, 21:21:16 via Website

ich hätte vlt erwähnen sollen, dass ich diesen Code in einer Schleife ausführe ;)

1ViewGroup parent //...
2
3for(int y = 10; y >= 0; y--){
4 LinearLayout row = new LinearLayout(ctx);
5
6 for(int x = 0; x < 10; x++){
7
8 View cell = layoutInflater.inflate(R.layout.templates, null).findViewById(R.id.template_empty);
9 row.addView(cell);
10 }
11
12 parent.addView(row);
13}

— geändert am 18.05.2012, 21:21:47

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

19.05.2012, 10:59:59 via App

Hm,

nur eine Idee, aber versuch mal inflate(R.layout.xy, null, false).

Lg Ansgar

Antworten
Rainu
  • Forum-Beiträge: 42

20.05.2012, 13:28:18 via Website

Ich hab's rausgefunden! Es folgt nun die komplette Lösung:

1<?xml version="1.0" encoding="utf-8"?>
2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent" >
5
6
7 <Button
8 style="@style/BlockStyleWorld"
9
10 android:id="@+id/template_empty"
11 />
12
13</LinearLayout>
In dieser Datei sind alle "Vorlagen".

Anschließend kann man wie folgt ein Button heraus"kopieren"

1ViewGroup vg = (ViewGroup)layoutInflater.inflate(R.layout.templates, null);
2View cell = vg.findViewById(R.id.template_empty);
3vg.removeView(cell);

Es lag daran, dass der Button noch im Template-Layout gebunden war. Man muss nach dem finden des Buttons ihn aus seinem Eltern-View entfernen.

Eine Frage hab ich allerdings noch: Wie sihet es mit der Performance aus. Das klingt alles ziemlich aufwändig! Ist es denn "gängige Praxis" oder gibts noch andere Vörschläge?

Rainu

Antworten