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:
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😛addingBottom="@dimen/activity_vertical_margin"
android😛addingLeft="@dimen/activity_horizontal_margin"
android😛addingRight="@dimen/activity_horizontal_margin"
android😛addingTop="@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]
 
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.
 
ok das mit den beiden Scroll-Layouts ineinander ist noch von einer früheren Version, tut aber doch hier nichts zur Sache?
 
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.
 
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.
 
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.
 
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😛addingBottom="@dimen/activity_vertical_margin"
android😛addingLeft="@dimen/activity_horizontal_margin"
android😛addingRight="@dimen/activity_horizontal_margin"
android😛addingTop="@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]
 
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.
 
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...
 
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😛addingBottom="@dimen/activity_vertical_margin"
android😛addingLeft="@dimen/activity_horizontal_margin"
android😛addingRight="@dimen/activity_horizontal_margin"
android😛addingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

</TableLayout>[/XML]

Im Anhang das Ergebnis.
 

Anhänge

  • Text.png
    Text.png
    2,5 KB · Aufrufe: 28
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)?
 
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:
 
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:
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?
 
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.
 

Zurück
Oben