Das Table Layout

  • Hallo,


    Ich habe eine frage zu dem Table Layout. Im Internet gibt es zu diesem
    Thema nur wenige schlechte Tutorials. (Wenn ihr eins kennt, her damit)


    Wenn ich den Code unten ausführe und den App starte dann bleibt der Bildschirm einfach schwarz.
    Hat jemand Erfahrung mit Table Layout und kann mit Helfen ? Was muss die TableLayoutActivity
    Activity für ein extends haben.


    Hier der Code:


    TableLayoutActivity :


    public class TableLayoutActivity extends Activity {



    int PROVINCE_Alberta = 0;
    int PROVINCE_BC = 1;
    int PROVINCE_Manitoba = 2;
    int PROVINCE_NewBrunswick = 3;
    int PROVINCE_Newfoundland = 4;
    int PROVINCE_Northwest = 5;
    int PROVINCE_NovaScotia = 6;
    int PROVINCE_Nunavut = 7;
    int PROVINCE_Ontario = 8;
    int PROVINCE_PEI = 9;
    int PROVINCE_Quebec = 10;
    int PROVINCE_Saskatchewan = 11;
    int PROVINCE_Yukon = 12;


    int numProvinces = 13;


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.main);


    String[] provinces = new String[numProvinces];
    provinces[PROVINCE_Alberta] = "Alberta";
    provinces[PROVINCE_BC] = "British Columbia";
    provinces[PROVINCE_Manitoba] = "Manitoba";
    provinces[PROVINCE_NewBrunswick] = "New Brunswick";
    provinces[PROVINCE_Newfoundland] = "Newfoundland and Labrador";
    provinces[PROVINCE_Northwest] = "Northwest Territories";
    provinces[PROVINCE_NovaScotia] = "Nova Scotia";
    provinces[PROVINCE_Nunavut] = "Nunavut";
    provinces[PROVINCE_Ontario] = "Ontario";
    provinces[PROVINCE_PEI] = "Prince Edward Island";
    provinces[PROVINCE_Quebec] = "Quebec";
    provinces[PROVINCE_Saskatchewan] = "Saskatchewan";
    provinces[PROVINCE_Yukon] = "Yukon";
    // Get the TableLayout
    TableLayout tl = (TableLayout) findViewById(R.id.maintable);


    Log.d("Main", "num:" + numProvinces);
    // Go through each item in the array
    for (int current = 0; current < numProvinces; current++)
    {
    Log.d("For", "Schleife" + current);
    // Create a TableRow and give it an ID
    TableRow tr = new TableRow(this);
    tr.setId(100+current);
    tr.setLayoutParams(new LayoutParams(
    LayoutParams.FILL_PARENT,
    LayoutParams.WRAP_CONTENT));


    // Create a TextView to house the name of the province
    TextView labelTV = new TextView(this);
    labelTV.setId(200+current);
    labelTV.setText("hallo");
    labelTV.setTextColor(Color.BLACK);
    labelTV.setLayoutParams(new LayoutParams(
    LayoutParams.FILL_PARENT,
    LayoutParams.WRAP_CONTENT));
    tr.addView(labelTV);


    // Create a TextView to house the value of the after-tax income
    TextView valueTV = new TextView(this);
    valueTV.setId(current);
    valueTV.setText("$0");
    valueTV.setTextColor(Color.BLACK);
    valueTV.setLayoutParams(new LayoutParams(
    LayoutParams.FILL_PARENT,
    LayoutParams.WRAP_CONTENT));
    tr.addView(valueTV);


    // Add the TableRow to the TableLayout
    tl.addView(tr, new TableLayout.LayoutParams(
    LayoutParams.FILL_PARENT,
    LayoutParams.WRAP_CONTENT));
    }
    }
    }
    Main.xml:



    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:stretchColumns="2"
    android:id="@+id/maintable" >

  • In deinem Code ist die main.xml leider unvollständig - da könnte noch was versteckt sein, glaub ich aber eher nicht.


    Ich hab noch nicht mit TableLayout gearbeitet, darum kann ich dir konkret auch nix sagen.


    Du hast dort aber (wohl für den TableLayout) android:layout_height="fill_parent" stehen - das kann manchmal andere Elemente vom Bildschirm vertreiben. Versuch es bei der Höhe am besten immer mit wrap_content. Um ein Element dann doch noch so groß wie möglich zu machen, hilft ein android:layout_weight="1"


    Vielleicht verteilst du mal ein paar Hintergrundfarben, dann findest du die Elemente hoffentlich wieder...

  • Bei mir schaut es so aus



    und nun die Daten in einer Schleife baue ich wie folgt zusammen




    in der xml


  • Hallo killphil75,


    Hier noch eine Frage zu deinem obigen Quellcode.
    In dem 1 Code wird der Text festgelegt.
    Aber was passiert in Code 2? Und was kommt jetzt in die Schleife.
    Können jetzt flexible Zeilen hinzugefügt werden?
    Muss ich das TableLayout jetzt nicht auch noch setzen:
    table.addView(rowZId1);
    setContentView(table);

  • Also in 1) wird nur das Tablelayout gesucht und eine Instanz gespeichert

    Code
    TableLayout tl = (TableLayout) findViewById(R.id.tableLayout1);


    Und dann füge ich einen Header hinzu, was im Grunde ja auch nur eine Tabellenzeile ist.


    der 2te Code Teil ist ja fast identisch, den habe ich nur mal ausgeklammert, weil das bei mir der Teil ist, der in einer Schleife läuft und mit Daten befüllt wird.


    Code
    for(int i=0;i<tabelle.size();i++) {
              		TabEintrag data = tabelle.get(i);		// Daten aus Tabelle holen


    Code
    col1.setText( String.valueOf(data.getId()));


    wobei data einfach eine Datenstruktur/Klasse ist - könnte ja auch ein Array sein, was auch immer ...



    Das setzen des Grundlayout hab ich weggelassen das ist ja Standardkost.


    Code
    public void onCreate(Bundle savedInstanceState) {
       
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.act_tabelle);
  • Ich will dir jetzt nicht den Spaß am TableLayout vermiesen, aber ich hab mir den Code mal angeschaut und hab 'nen Gegen-Vorschlag:


    ListView mit einem netten ListAdapter, der dir jeweils ein LinearLayout (mit orientation=HORIZONTAL) für deine Listeneinträge bastelt.


    Diese Listeneinträge kannst du entweder wie hier per Hand zusammenbauen oder über einen Inflater aus einer XML-Layout-Datei holen lassen.


    Die Android-Doku hat Beispiele, welche direkt auf ListActivity aufsetzt - wenn du einen eigenen View hast, dann musst du statt "setListAdapter(new MyListAdapter(this));" folgendes eintragen:

    Java
    MyListAdapter myListAdapter = new MyListAdapter();
    myListView = (ListView) findViewById(R.id.containerListView);
    myListView.setAdapter(myListAdapter);
    maListView.setOnItemClickListener(myListAdapter);
  • Hier noch einmal die Hintergrund Idee:


    Ich möchte eine Tabelle mit Punkten von 10 Spielern aufstellen. Die einzelnen Punkte werden aber erst wehrend der Laufzeit über die Buttons eingegeben.
    Im Anhang findet ihr ein Bild wie dies aussehen sollte. Das problemm:
    Wie mann sied habe ich die einzelnen spalten alle einzeln in der XML Datei definiert.
    Ich möchte jetzt nur eine Zeile neu beschriften.
    Wie funktioniert dass jetzt mit den TableRows?
    Meine Struktur Idee:
    - Bei einer Benutzer Eingabe wird der Lehrwert der Zeile mit der Punktzahl überschrieben.
    - Ich füge jetzt die gesamte Zeile mit allen aktualisierten werten neu zum TableLayout hinzu
    - Mir setContentView füge ich die Aktualisierung zu Ende.


    jetzt die Konkrete Frage:


    Nutzt das gesamte TableLayout eine XML Datei als Gerüst oder werden nur sol viele Spalten angezeigt wie in der TableRow definiert ??? :-!


    Danke für eure Mithilfe

  • Zitat

    Nutzt das gesamte TableLayout eine XML Datei als Gerüst oder werden nur
    sol viele Spalten angezeigt wie in der TableRow definiert ??? :-!

    Das kannst du halten wie du möchtest, entweder XML oder halt dynamisch im Programmverlauf.
    Natürlich kannst du vorher alle Zeilen vordefinieren, was aber nicht besonders effektiv ist. Stell Dir vor es werden 11 oder mehr Spieler.


    Das Problem an deinem Screenshot, ich weiss noch immer nicht wo du hin willst.
    Die Punkte Button oben, wie willst du wissen welcher Spiele wieviele Punkte bekommt - wie realisierst du die Auswahl/Zuteilung ???

    Zitat

    - Mir setContentView füge ich die Aktualisierung zu Ende.

    Brauchst du nur einmal am Anfang zum Init. Neue Views einfach nur per addView.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!