Android EditText und TextView haben unterschiedliche größen innerhalb einer TableRow

Der

Mitglied
Hallo,
ich erstelle gerade eine Tabelle. Anfangs besteht sie nur aus einer Spalte aus TextView's. Diese sind ohne Lücke untereinander. Wenn dann die EditText's dazu kommen, dann entstehen Lücken zwischen den TextView's. Bitte schaut euch dazu die Bilder im Anhang an.
Das das EditText beim Name kleiner ist, das beachtet bitte nicht!

Ich habe die Höhe jeder TableRow fest gelegt (auf einen festen int-wert).
Und: Höhe-der-Reihe == Höhe-der-TextViews == Höhe-der-EditText's

Wenn ihr den Code braucht:
Java:
public class MainActivity extends Activity {
	private TableLayout tl;
	private TableRow tr[] = new TableRow[21];
	private Point size;
	private int weite;
	private int hoehe;
	private int textGroesse;
	private int farbeName;
	private int farbeErg;
	private int farbe1Bahn;
	private int farbeAsse;
	private int farbe2Bahn;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);	
		initialisiere();
		erstelleErsteSpalte();
//		erstelleNeueSpalte();
	}

	private void erstelleErsteSpalte() {
		for (int i = 0; i < 21; i++) {
	        tr[i] = new TableRow(this);
	        tr[i].setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, hoehe));
	        tl.addView(tr[i]);
		}
        tr[0].addView(erstelleTV("Name:", farbeName));
        
        for (int i = 1; i <= 18; i++) {
	        tr[i].addView(erstelleTV("Bahn " + i + ":", i % 2 == 0 ? farbe1Bahn : farbe2Bahn));
        }
        tr[19].addView(erstelleTV("Ergebnis:", farbeErg));
        tr[20].addView(erstelleTV("Asse:", farbeAsse));
        
	}

	private TextView erstelleTV(String text, int rgb) {
		TextView tv = new TextView(this);
        tv.setText(text);
        tv.setWidth(weite);
        tv.setHeight(hoehe);
        tv.setTextSize(textGroesse);
        tv.setBackgroundColor(rgb);
		return tv;		
	}

	private void initialisiere() {
		setContentView(R.layout.activity_main);
		
		farbeName = Color.rgb(100, 200, 100);
		farbeErg = Color.rgb(255, 255, 0);
		farbeAsse = Color.rgb(150, 255, 150);
		farbe1Bahn = Color.rgb(155, 155, 155);
		farbe2Bahn = Color.rgb(205,  205,  205);
		
		Display display = getWindowManager().getDefaultDisplay();
		size = new Point();
		display.getSize(size);
		
		tl = (TableLayout) findViewById(R.id.tl);
		tl.setOnClickListener(new OnClickListener() {	
			
			@Override
			public void onClick(View v) {
				erstelleNeueSpalte();
			}
			
		});
		
		setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);	
		
		weite = (int) (size.x / 5);
		hoehe = (int) (size.y / 21);
		textGroesse = (int) (size.y / 32);
	}

	private void erstelleNeueSpalte() {
        EditText et = new EditText(this);
        et.setBackgroundColor(farbeName);
        tr[0].addView(et);
        for (int i = 1; i <= 18; i++) {
            tr[i].addView(erstelleET(true, i % 2 == 0 ? farbe1Bahn : farbe2Bahn));
        }
        tr[19].addView(erstelleET(false, farbeErg));
        tr[20].addView(erstelleET(false, farbeAsse));
	}

	private EditText erstelleET(boolean enabled, int rgb) {
        EditText et = new EditText(this);        
        et.setBackgroundColor(rgb);
        et.setWidth(weite);
        et.setHeight(hoehe);
        et.setTextSize(textGroesse);
        et.setKeyListener(new NumberKeyListener() {
        	   @Override
        	   protected char[] getAcceptedChars() {
        	      char numberChars[] = {'1','2','3','4','5','6','7'};
        	      return numberChars;
        	   }

				@Override
				public int getInputType() {
					return InputType.TYPE_CLASS_NUMBER;
				}
        	});
        et.setFilters(new InputFilter[] {new InputFilter.LengthFilter(1)});
        et.addTextChangedListener(new TextWatcher() {			
			@Override
			public void onTextChanged(CharSequence s, int start, int before, int count) {}			
			@Override
			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {}
			
			@Override
			public void afterTextChanged(Editable s) {
				zeigeNeuesErgebnis();
			}
		});
        et.setEnabled(enabled);
		return et;
	}

	private void zeigeNeuesErgebnis() {
		
	}
	
//	@Override
//	public boolean onTouchEvent(MotionEvent e) {
//		return true;
//	}
	
}
Hab den Code (noch) nicht auskommentiert, wenn ihr Fragen habt meldet euch!

Auch der Platz der (schon ohne die EditText's) zwischen dem bildschirmrand und den TextViews ist stört mich und ich weiß nicht woher er kommt.

Danke für das Lesen und Interesse und bitte meldet euch wenn ihr etwas wisst!
 

Anhänge

  • NurTextViews.jpg
    NurTextViews.jpg
    13,4 KB · Aufrufe: 45
  • TextViewsUndEditText.jpg
    TextViewsUndEditText.jpg
    14,6 KB · Aufrufe: 40
Zuletzt bearbeitet:

Der

Mitglied
Den Java-Code habe ich schon drin. Hier noch der XML-Code:
[XML]
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/ScrollView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<HorizontalScrollView
android:id="@+id/horizontalScrollView1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<TableLayout
android:id="@+id/tl"
android:layout_width="wrap_content"
android:layout_height="match_parent" >

</TableLayout>

</HorizontalScrollView>

</ScrollView>
[/XML]
 

dzim

Top Contributor
1) Sorry, hatte ich übersehen!
2) Woah! verschachtelte ScrollLayouts??? Warum???

Und: Das TableLayout hat android:layout_width="wrap_content" - wird also nie den gesamten verfügbaren Platz horizontalen Platz einnehmen.
 

Der

Mitglied
ok das mit den beiden Scroll-Layouts ineinander ist noch von einer früheren Version, tut aber doch hier nichts zur Sache?
 

dzim

Top Contributor
Wahrscheinlich nicht. Wissen tu ich es aber auch dem Kalten heraus auch nicht. Ich denke das wrap_content in dem width-Attribut ist eher entscheidend.
 

Der

Mitglied
Gut also der Platz am Rand ist zwar ein wenig Störend, allerdings kann ich noch über ihn hinweg sehen ;D (was nicht heißt dass ich nicht doch versuchen werde es zu ändern).
Es wird allerdings durch das ersetzen von "wrap_content" durch "fill_parent" oder "match_parent" nicht verändert.

Aber das wirklich "schlimme" ist doch auf den Bildern zu sehen, meine TextViews sind nicht mehr direkt untereinander und auch zwischen den EditTexts gibt es Lücken.
 

dzim

Top Contributor
Dann denke ich, das die Horizontale ScrollBar doch einen negativen Effekt hat.

Zeig doch mal das komplette XML (also mit den TextView und EditTexts), dann kann ich vielleicht mal bei Gelegenheit damit herumspielen.
 

Der

Mitglied
ok also nochmal beides:

Java:
    public class MainActivity extends Activity {
        private TableLayout tl;
        private TableRow tr[] = new TableRow[21];
        private Point size;
        private int weite;
        private int hoehe;
        private int textGroesse;
        private int farbeName;
        private int farbeErg;
        private int farbe1Bahn;
        private int farbeAsse;
        private int farbe2Bahn;
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            initialisiere();
            erstelleErsteSpalte();
    //      erstelleNeueSpalte();
        }
     
        private void erstelleErsteSpalte() {
            for (int i = 0; i < 21; i++) {
                tr[i] = new TableRow(this);
                tr[i].setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, hoehe));
                tl.addView(tr[i]);
            }
            tr[0].addView(erstelleTV("Name:", farbeName));
           
            for (int i = 1; i <= 18; i++) {
                tr[i].addView(erstelleTV("Bahn " + i + ":", i % 2 == 0 ? farbe1Bahn : farbe2Bahn));
            }
            tr[19].addView(erstelleTV("Ergebnis:", farbeErg));
            tr[20].addView(erstelleTV("Asse:", farbeAsse));
           
        }
     
        private TextView erstelleTV(String text, int rgb) {
            TextView tv = new TextView(this);
            tv.setText(text);
            tv.setWidth(weite);
            tv.setHeight(hoehe);
            tv.setTextSize(textGroesse);
            tv.setBackgroundColor(rgb);
            return tv;     
        }
     
        private void initialisiere() {
            setContentView(R.layout.activity_main);
           
            farbeName = Color.rgb(100, 200, 100);
            farbeErg = Color.rgb(255, 255, 0);
            farbeAsse = Color.rgb(150, 255, 150);
            farbe1Bahn = Color.rgb(155, 155, 155);
            farbe2Bahn = Color.rgb(205,  205,  205);
           
            Display display = getWindowManager().getDefaultDisplay();
            size = new Point();
            display.getSize(size);
           
            tl = (TableLayout) findViewById(R.id.tl);
            tl.setOnClickListener(new OnClickListener() {  
               
                @Override
                public void onClick(View v) {
                    erstelleNeueSpalte();
                }
               
            });
           
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
           
            weite = (int) (size.x / 5);
            hoehe = (int) (size.y / 21);
            textGroesse = (int) (size.y / 32);
        }
     
        private void erstelleNeueSpalte() {
            EditText et = new EditText(this);
            et.setBackgroundColor(farbeName);
            tr[0].addView(et);
            for (int i = 1; i <= 18; i++) {
                tr[i].addView(erstelleET(true, i % 2 == 0 ? farbe1Bahn : farbe2Bahn));
            }
            tr[19].addView(erstelleET(false, farbeErg));
            tr[20].addView(erstelleET(false, farbeAsse));
        }
     
        private EditText erstelleET(boolean enabled, int rgb) {
            EditText et = new EditText(this);        
            et.setBackgroundColor(rgb);
            et.setWidth(weite);
            et.setHeight(hoehe);
            et.setTextSize(textGroesse);
            et.setKeyListener(new NumberKeyListener() {
                   @Override
                   protected char[] getAcceptedChars() {
                      char numberChars[] = {'1','2','3','4','5','6','7'};
                      return numberChars;
                   }
     
                    @Override
                    public int getInputType() {
                        return InputType.TYPE_CLASS_NUMBER;
                    }
                });
            et.setFilters(new InputFilter[] {new InputFilter.LengthFilter(1)});
            et.addTextChangedListener(new TextWatcher() {          
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {}         
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count,
                        int after) {}
               
                @Override
                public void afterTextChanged(Editable s) {
                    zeigeNeuesErgebnis();
                }
            });
            et.setEnabled(enabled);
            return et;
        }
     
        private void zeigeNeuesErgebnis() {
           
        }
       
    //  @Override
    //  public boolean onTouchEvent(MotionEvent e) {
    //      return true;
    //  }
       
    }

[XML] <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/ScrollView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<HorizontalScrollView
android:id="@+id/horizontalScrollView1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<TableLayout
android:id="@+id/tl"
android:layout_width="wrap_content"
android:layout_height="match_parent" >

</TableLayout>

</HorizontalScrollView>

</ScrollView>[/XML]
 

dzim

Top Contributor
Ich dachte, der Horizontale ScrollView ist weg??? Ich würde dir wirklich empfehlen, den erst einmal zu entfernen, sonst wird es zu komplex. Scrollen auf mobilen Geräten ist eh doof, also versuche deine UI so anzulegen, das nicht unbedingt in beide Richtungen gescrollt werden muss.

Das Problem an deinem Code ist

1) dass du für deine Zeilen keine TableRows (oder zumindest LinearLayouts) anlegst. Dadurch sollte das Hinzufügen einer zweiten Spalte IMHO unmöglich werden
--> Für jede Zeile eine TableRow anlegen, dann die Elemente in der Richtigen Reihenfolge (also Spaltenweise) hinzufügen.

2) LayoutParams sind für dich anscheinend zweitrangig - dadurch sieht es am Ende auch eben so aus, wie deine Screenshots zeigen
--> wenn du ein Element einem Container hinzufügst (zum Beispiel einen TextView zu einer TableRow), solltest du auch die LayoutParams setzen - sie sind das Pendant im Code zu dem, was du an Attributen im XML-Layout setzt.

3) Eye-Candy: Bitte kein denglish - da bekomme ich Augenkrebs. Schreibe die UI auf English, das ist sauberer, denn die API ist bereits English (#onCreate() ruft #initialisiere() auf - örgs)

Damit der Aufwand möglichst gering wird, empfehle ich dir noch, die Spalten in eigene XML-Layouts (TableRow, welche einen TextView und einen EditText enthalten - letzteren kann man ja auch mit visibility="invisible" erst einmal nicht anzeigen lassen) auszulagern, die du im Code mit einem LayoutInflater einfügen kannst - aber auch hier: LayoutParams nicht vergessen.
Um herauszufinden, welche LayoutParams notwendig sind, kannst du ja dieses Layout via <include>-Tag im TableLayout einfügen.
 

Der

Mitglied
Da der Nutzer doch so viele Spalten erzeugen kann wie er möchte brauche ich doch die ScrollView... Die Vertikale übrigends auch, da es sonst zu klein werden würde und ich eventuell noch einen Zoom einbauen werde. ... Hab mich geirrt, bei der früheren UND bei der neuen Version werden beise ScrollViews gebraucht D:

1) dass du für deine Zeilen keine TableRows (oder zumindest LinearLayouts) anlegst. Dadurch sollte das Hinzufügen einer zweiten Spalte IMHO unmöglich werden
--> Für jede Zeile eine TableRow anlegen, dann die Elemente in der Richtigen Reihenfolge (also Spaltenweise) hinzufügen.
??? Ich lege doch hier meine TableRows an

Java:
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            initialisiere();
            erstelleErsteSpalte(); // hier wird mein TableRow Array initialisiert und sogar schon mit der ersten Spalte befüllt...
    //      erstelleNeueSpalte(); // hier wurde schon gleich die 2. spalte hinzugefügt, die Methode erstelle Neue Spalte wird aber auch in der onClick-Methode meines TableLayouts ausgeführt, ein Klick bedeutet eine Neue Spalte
        }
     
        private void erstelleErsteSpalte() {
            for (int i = 0; i < 21; i++) {
                tr[i] = new TableRow(this);
                tr[i].setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, hoehe));
                tl.addView(tr[i]);
            }
            tr[0].addView(erstelleTV("Name:", farbeName));
           
            for (int i = 1; i <= 18; i++) {
                tr[i].addView(erstelleTV("Bahn " + i + ":", i % 2 == 0 ? farbe1Bahn : farbe2Bahn));
            }
            tr[19].addView(erstelleTV("Ergebnis:", farbeErg));
            tr[20].addView(erstelleTV("Asse:", farbeAsse));
           
        }

Zu 2): Könntest du mir zu den LayoutParams was erklären oder ein Beispiel geben? Ich setze doch in jeder TableRow LayoutParams... Wo muss ich noch welche setzen? Dass ich dort "hoehe" als 2. setze ist wahrscheinlich nicht so schön? Wie mache ich es richtig?

3) Hab ich mir selbst auch schon vorgeworfen, ich probier (daran zu denken) alle eigenen Methoden Deutsch zu benennen. Dadurch entsteht zwar ein Denglish aber ich nenne meine Methoden nicht falsch, dadurch, dass mein Englisch nicht besonders gut ist gebe ich den Methoden sonst Namen die nicht ganz Stimmen.

Die Spalten könnte ich doch sicher nicht im XML-Code erstellen, ich weiß doch nicht wie viele ich brauche, eventuell eine mehr als ich im XML-Code erstellt und unsichtbar vorbereitet habe.

PS: Ich werd mal bei Gelegenheit ein TableLayout mit TextViews und EditTexts mit wenigen Spalten und Zeilen/Reihen erstellen um erst mal im kleinem zu sehen wie ich die unschönen Lücken verhindere. Außerdem ist dann die Übersicht für dich besser, fremder - und auch noch unkommentierter - Code ist schwer zu Verstehen...
 

Der

Mitglied
Also hier noch mein Test mal:

Java:
package com.example.testtablelayout;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.view.Menu;
import android.view.ViewGroup.LayoutParams;
import android.widget.EditText;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

public class MainActivity extends Activity {
	private TableLayout tl;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tl = (TableLayout) findViewById(R.id.TableLayout1);
        
        TableRow tr = new TableRow(this);
        tr.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        
        TextView tv = new TextView(this);
        tv.setText("TEST");
        tv.setBackgroundColor(Color.BLUE);
        tv.setHeight(100);
        tr.addView(tv);
        
        EditText et = new EditText(this);
        et.setBackgroundColor(Color.YELLOW);
        et.setText("EditText");
        et.setHeight(100);
        tr.addView(et);
        
        tl.addView(tr);
    }

[XML]<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/TableLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

</TableLayout>[/XML]

Im Anhang das Ergebnis.
 

Anhänge

  • Text.png
    Text.png
    2,5 KB · Aufrufe: 28

dzim

Top Contributor
Ah. Sorry, hatte die TableRow übersehen.

Nur so als Tipp: Nutze für deine TableRows vielleicht eine Liste, statt eines statischen Arrays.

LayoutParams: Ja, du setzt ein LayotParams-Objekt an deine TableRow und sagst der Anwendung damit, wie die jeweilige TableRow in dem darüberliegenden TableLayout angezeigt werden soll. ABER: Du sagst nicht dem TextView oder dem EditText, wie er in der TableRow aussehen soll. Du musst es hier also auch noch anfügen.

Ich würde das Layout einer einzelnen Zeile in einer XML-Datei definieren und dann die Elemente, die man nicht sehen soll per visibility="gone" deaktivieren und im Code nur, wenn der Nutzer es sehen will, wieder auf [c]spaltenView.setVisibility(View.VISIBLE);[/b] (wobei spaltenView zum Beispiel ein EditText sein kann).

Mich würde noch interessieren, wie viele Zeilen es geben kann. Ist das dynamisch oder statisch (dein 21 bei den TableRows sagt mir, eher statisch)?
 

Der

Mitglied
21 Zeilen aber dafür X spalten (also zeilen statisch und spalten dynamisch). Deswegen brauch ich auch keine dynamische Liste sondern es reicht ein statisches array...

LayoutParams: Ja, du setzt ein LayotParams-Objekt an deine TableRow und sagst der Anwendung damit, wie die jeweilige TableRow in dem darüberliegenden TableLayout angezeigt werden soll. ABER: Du sagst nicht dem TextView oder dem EditText, wie er in der TableRow aussehen soll. Du musst es hier also auch noch anfügen.

also reicht es nicht zu schreiben: "tv.setHeight(hoehe);"? Wie könnte ich es sonst schreiben?

Ich würde das Layout einer einzelnen Zeile in einer XML-Datei definieren und dann die Elemente, die man nicht sehen soll per visibility="gone" deaktivieren und im Code nur, wenn der Nutzer es sehen will, wieder auf [c]spaltenView.setVisibility(View.VISIBLE);[/b] (wobei spaltenView zum Beispiel ein EditText sein kann).

? Das versteh ich nicht D:
 

dzim

Top Contributor
Bedenke einfach, dass es einen Unterscheid zwischen "Wie hoch ist ein Element?" und "Wie viel vertikalen Platz nimmt ein Element ein?" gibt. Auch die Ausrichtung (Texte links, rechts, oben, unten, Zentrum) spielt eine Rolle. Aber ganz wichtig ist auch: Wie viel Platz vom Parent darf eich einnehmen? Kurzum: LayoutParams bilden die Code-Seite von vielen, das im XML z.B. via
[XML]
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="2dp"
[/XML]
gesetzt wird. Ohne dass weiss das Layout nicht (unbedingt), wo (oder wie) es die Elemente in seinem Parent-Container darstellen soll.

Beispiel:
[XML]
<?xml version="1.0" encoding="utf-8"?>
<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="2dp"
android:tag="spalte1"
android:text="spalte 1" />

<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="2dp"
android:ems="10"
android:tag="spalte2"
android:text="spalte 2" >
</EditText>

<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="2dp"
android:tag="spalte3"
android:text="spalte 3"
android:visibility="gone" />

<EditText
android:id="@+id/editText2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="2dp"
android:ems="10"
android:tag="spalte4"
android:text="spalte 4"
android:visibility="gone" >
</EditText>

<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="2dp"
android:tag="spalte5"
android:text="spalte 5"
android:visibility="gone" />

<EditText
android:id="@+id/editText3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="2dp"
android:ems="10"
android:tag="spalte6"
android:text="spalte 6"
android:visibility="gone" >
</EditText>

</TableRow>
[/XML]
Stellt eine einzige Zeile dar. Alle Spalten, bis auf die ersten zwei, werden nicht angezeigt (oder genauer: sie werden nicht einmal in der Berechnung des Parents für Hohe und Breite einbezogen, so als wären sie 0px hoch und breit): [c]android:visibility="gone"[/c]. Bei [c]android:visibility="invisible"[/c] werden Höhe und bereite korrekt mit berechnet, also wäre auch scrollen notwendig, wenn sie gar nicht sichtbar wären - in deinem Fall willst du das ja sicher nicht.

Wenn du die Zeilen eh einmal zum Anfang alle einfügst, kannst du es mit der obigen XML als Inhalt auch mit dem <include>-Tag genau deine 21 Mal machen:
[XML]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<HorizontalScrollView
android:id="@+id/horizontalScrollView1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<TableLayout
android:id="@+id/tl"
android:layout_width="wrap_content"
android:layout_height="match_parent" >

<include layout="@layout/test" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="2dp"/>
<include layout="@layout/test" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="2dp"/>
<include layout="@layout/test" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="2dp"/>
<include layout="@layout/test" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="2dp"/>
<include layout="@layout/test" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="2dp"/>
<include layout="@layout/test" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="2dp"/>
<include layout="@layout/test" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="2dp"/>
<include layout="@layout/test" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="2dp"/>
<include layout="@layout/test" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="2dp"/>
<include layout="@layout/test" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="2dp"/>
<include layout="@layout/test" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="2dp"/>
<include layout="@layout/test" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="2dp"/>
<include layout="@layout/test" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="2dp"/>
<include layout="@layout/test" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="2dp"/>
<include layout="@layout/test" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="2dp"/>
<include layout="@layout/test" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="2dp"/>
<include layout="@layout/test" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="2dp"/>
<include layout="@layout/test" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="2dp"/>
<include layout="@layout/test" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="2dp"/>
<include layout="@layout/test" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="2dp"/>
<include layout="@layout/test" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="2dp"/>

</TableLayout>
</HorizontalScrollView>

</LinearLayout>
[/XML]

Jetzt noch einmal zum Problem mit den LayoutParams:
Wenn du das machst...
Java:
       tl = (TableLayout) findViewById(R.id.TableLayout1);
        
        TableRow tr = new TableRow(this);
        tr.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        
        TextView tv = new TextView(this);
        tv.setText("TEST");
        tv.setBackgroundColor(Color.BLUE);
        tv.setHeight(100);
        tr.addView(tv);
        
        EditText et = new EditText(this);
        et.setBackgroundColor(Color.YELLOW);
        et.setText("EditText");
        et.setHeight(100);
        tr.addView(et);
        
        tl.addView(tr);
...wäre es im XML ungefähr so:
[XML]
<?xml version="1.0" encoding="utf-8"?>
<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<TextView
android:id="@+id/textView1"
android:tag="spalte1"
android:text="spalte 1" />

<EditText
android:id="@+id/editText1"
android:ems="10"
android:tag="spalte2"
android:text="spalte 2" >
</EditText>

<!-- ... -->

</TableRow>
[/XML]
Das Verhalten wird dadurch (bei mir am Rechner) nicht mehr nachvollziehbar...

Wenn du jetzt bestimmte Spalten wieder sichtbar machen möchtest:
Java:
	private void showColumn(int column, boolean show) { // starting from "1"
		TableLayout tl = (TableLayout) findViewById(R.id.TableLayout1);
		for (int i = 0; i < tl.getChildCount(); i++) {
			if (!(tl.getChildAt(i) instanceof TableRow)) {
				// do something else ???
				continue;
			}
			TableRow tr = (TableRow) tl.getChildAt(i);
			// View v = tr.findViewById(R.id.<eineIdAusDemXml>) // schneller
			View v = tr.findViewWithTag(String.format("spalte%d", column)); // generischer
			if (v != null) {
				// Spalte wurde gefunden!
				v.setVisibility(show ? View.VISIBLE : View.GONE); // alternative: View.INVISIBLE
			} else {
				// Spalte wurde nicht gefunden!
			}
		}
	}
ACHTUN: Das habe ich nur so schnell ohne es zu testen zusammengeschustert!
Ähnliche Methoden kannst du nutzen um Text zu setzen, die textWatcher an den EditText zu binden, u.v.m.

Jetzt klarer?
 
Zuletzt bearbeitet:

Der

Mitglied
Super DANKE!

1.)
<include layout="@layout/test"

Ich erstelle also ein Layout "test" und füge den Code ein der für jede Zeile gleich sein soll!?! Also das inclode spart mir doppelten Code?! So hab ich das verstanden.

2.)
Wenn ich einem Element keine LayoutParams zuordne ist es dann Zufällig wie viel Platz sie einnehmen? Oder gibt es "default-Werte" die falls die LayoutParams fehlen eingesetzt werden? (Wenn es so ist, dann unterscheiden sich die "defaulf-Werte" zwischen TextViews Und EditTExts?!)

3.)
Die Methode gefällt mir :toll:
Wenn ich einer TableRow die Visibility "gone" setze, dann sind auch alle Komponenten innerhalb der TableRow unsichtbar?
 

dzim

Top Contributor
1) Das include erspart dir, die 21 Rows im Code anzulegen. Später kannst du dann über die Children des TableViews iterieren und dann die Row anpassen, wie du möchtest. Du musst dich also nicht im Code um das Layout der Rows kümmern - halt und auch nicht (und das ist das entscheidende), um das Layout der Widgets, die wiederum in der Row enthalten sind.

Aber sonst hast du richtig verstanden: Erstelle dir einmal ein Layout ("test" war nur mein Name, nimm besser was anderes ;-) ) und du kannst es X-Mal verwenden.

2) Es gibt schon defaults, aber dann passiert halt so was wie bei dir und es sieht am Ende... S******e... aus.

3) Wenn du eine Row auf "invisible" setzt, dann ist sie, sowie alle enthaltenen Widgets, unsichtbar, nimmt aber immer noch die volle Höhe ein, als wäre sie sichtbar. "Gone" lässt dann auch noch Höhe (und Breite, auch wenn das hier wohl eher keine Rolle spielt) auf "0" schrumpfen. Also ist dann alles weg und nichts mehr zu sehen von der Row.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Text input into editText Android & Cross-Platform Mobile Apps 2
Besset Android Edittext onTextChange endlosschleife Android & Cross-Platform Mobile Apps 2
A Mehrere EditText-Komponenten sollen zusammenarbeiten Android & Cross-Platform Mobile Apps 2
B Absturz der App bei leeren Edittext Android & Cross-Platform Mobile Apps 14
S Android Absoluter Neuling: EditText zur Laufzeit verändern bzw. über Button Android & Cross-Platform Mobile Apps 2
M Android Edittext width passend zum Text Android & Cross-Platform Mobile Apps 1
S Dynamische EditText View eingaben in Datenbank speichern Android & Cross-Platform Mobile Apps 0
C EditText Android & Cross-Platform Mobile Apps 1
N Android EditText.setError() funktioniert nicht nach Rotation Android & Cross-Platform Mobile Apps 1
N Android EditText: Numpad statt Tastatur einblenden Android & Cross-Platform Mobile Apps 2
P Android EditText zeigt keine Umlaute Android & Cross-Platform Mobile Apps 6
P EditText mehrere Zeilen - verschiedene Farbe Android & Cross-Platform Mobile Apps 3
N "Schöne" Datatable in Android und setzen von Parametern von Textview im Code Android & Cross-Platform Mobile Apps 5
M Android Dynamische SchriftGröße einer TextView Android & Cross-Platform Mobile Apps 3
N Zugriff auf TextView in ListItem via ButtonClick Android & Cross-Platform Mobile Apps 4
G TextView ausgeben Android & Cross-Platform Mobile Apps 1
G keine TextView-Aktualisierung in der while-Schleife Android & Cross-Platform Mobile Apps 18
N Android bei textview.settext immer abbruch Android & Cross-Platform Mobile Apps 4
A Kann nicht in TextView einer anderen Klasse schreiben - wieso? Android & Cross-Platform Mobile Apps 9
J Android Multiline in TextView Android & Cross-Platform Mobile Apps 9
I Android Hintergrundfarbe von Textview (Shape) ändern Android & Cross-Platform Mobile Apps 19
N Textview macht immer nach einem Beistrich einen Abstand Android & Cross-Platform Mobile Apps 6

Ähnliche Java Themen

Neue Themen


Oben