Dynamisch neue Zeilen in Activity/LinearLayout einfügen

  • Antworten:5
Max M
  • Forum-Beiträge: 7

27.09.2009, 00:28:23 via Website

Hallo zusammen,

ich möchte eine 'dynamische' Activity erstellen.
Zu Beginn besteht die Activity (also das Layout) aus einer Zeile "01: <Eingabefeld>" und einem Button "Wert hinzufügen". (Siehe unten)

Wenn nun der Button "Wert hinzufügen" angeklickt wird, so soll unter der ersten Zeile eine Weiter Zeile "02: <Eingabefeld>" eingefügt werden. Für den nächsten Klick "03: <Eingabefeld>" usw.
Durch jeden Klick auf "Wert hinzufügen" soll also eine neue Zeile (ein neues LinearLayout mit TextView und EditText) eingefügt werden. Dabei sollen die neuen Zeilen genauso ausehen wie die erste Zeile.

Gibt es hier eine elegante Möglichkeit das erste (im XML definierte) LinearLayout "zeile" zu clonen, zu modifizieren und also neue Zeile einzufügen?

Im Moment erstell ich mir im Javacode erst ein neues LinearLayout in das ich dann ein ein neues TextView und ein neues EditText einhänge. Das ist nur irgendwie sehr umständlich. Auch muss ich bei dieser Methode alle Attribute (zB textColor=red) erneut per java-befehl vergeben. ich würde diese werte aber gerne
NUR im Layout-XML flegen... (siehe ganz unten)

Hat da jemand eine Idee?


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" />
...
<LinearLayout
android:id="@+id/zeile"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/nummer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="red"
android:text="01:"
/>
<EditText
android:id="@+id/eingabefeld"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:drawable/editbox_background"
android:text="Dies ist der erste Wert"
/>
</LinearLayout>
<Button
android:id="@+id/wertHinzufuegen"
android:text="Wert hinzufuegen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
...
</LinearLayout>


-----------------------

So in etwa erstell ich zur Zeit eine neue "Zeile". Dieser Code ist nicht richtig, sonder soll nur verdeutlichen wie umständlich ich da gerade vorgehe ;)

TextView cNr = new TextView(Test.this);
cNr.setText("02:");
cNr.setTextColor(Color.BLUE);


EditText cInput = new EditText(Test.this);
cInput.setText("hier bitte text eingeben");
cInput.setBackgroundResource(android.R.drawable.editbox_background);

LinearLayout newRow = new LinearLayout(Test.this);
newRow.addView(cNr);
newRow.addView(cInput);
newRow.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));

LinearLayout testview = (LinearLayout) findViewById(R.id.testlayout);
testview.addView(newRow,
2,
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

27.09.2009, 14:07:29 via Website

Aus dem Bauch raus würde Ich eine ListActivity nutzen. Dabei passt du das Datenmodell dynamisch an wenn der User klickt.

— geändert am 27.09.2009, 14:08:01

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Max M
  • Forum-Beiträge: 7

28.09.2009, 17:18:50 via Website

Danke für die Antwort.

Nur passt eine ListActivity hier leider nicht.

Ich möchte gerne eine Seite haben wo man mehere Werte eingibt (Texteingabe, Checkboxen, etc.).
=> Die Seite lässt sich also nicht als ListActivity gestallten.

Für ein Element soll es Möglich sein, mehrere (1-n) Werte einzugeben.
Und genau hierfür gibt es den Button "Wert hinzufügen". Dieser soll dann (wie oben dargestellt) eine weitere "zeile" einfügen...

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

29.09.2009, 09:37:24 via Website

da würde ich dir raten, mach eine custom componenten, die genau eine deiner zeilen abbildet.

diese kannst du dann "manuell" an das linearlayout anhängen.

einfach
1) linearlayout instanzieren.
2) custom componente namens MyRow erstellen
3) myRow an das linearlayout anhängen ( glaub addView )

und fertig

mfg

swordiApps Blog - Website

Antworten
Max M
  • Forum-Beiträge: 7

30.09.2009, 00:48:48 via Website

Hallo,
danke für den Tip. Genauso hab ich es jetzt realisiert. ;)
- Eigene Klasse erstellt die von LinearLayout erbt
- In dieser Klasse wird eine TextView und ein EditText erstellt

Jetzt kann ich diese Klasse im Java-Code sowie im XML benutzen. Genauso was wollte ich ;)

Ich bin dabei nun noch auf ein weiteres kleines Problem gestoßen. Dies gilt für meine eigene View wie für alle Standard-Views. Daher erklär ich es an einer TextView.

Wenn ich im XML eine View definiere, dann wird über -- android:id="@+id/testLabel" -- eine ID generiert:
z.B.:
<TextView
android:id="@+id/testLabel"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Dies ist ein Text"
/>
Auf diese View kann dann später über findViewById(R.id.testLabel) zugreifen.

Wenn ich nun aber im Java-Code selber eine TextView erstelle. Also z.B.
TextView test= new TextView(this.getContext());
test.setText("Dies ist auch ein Text");

Wie lautet dann die ID von dieser TextView?
test.getId() liefert bei mir immer "-1".
Was mach ich hier falsch?

Ich kann natürlich per test.setId() eine ID selber vergeben. Aber wie stell ich sicher, dass ich nicht
zufällig eine ID benutze die von android schon aus der XML-View generiert wurde?

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

02.10.2009, 19:26:42 via Website

naja es ist dein source code, also solltest du wissen, dass du keine id vergibst, die schon vorhanden ist.

einfach mit präfix oder sowas. wenn du das per xml machst, musst es auch selbst sicher stellen. da bleibt dir nix anderes übrig

swordiApps Blog - Website

Antworten