2D Array abfüllen

K

kbob

Neues Mitglied
0
Olà Leute.

Ich bin ziemlich neu in Java, bringe aber etwas erfahrung aus C++, PHP und ein Paar anderen Sprachen mit.

Ich habe einen bestimmten Algorithmus geschrieben, welcher mit einem Array arbeitet.
Nun brauche ich eigentlich "nur" noch die Werte korrekt in das 2D Array abzufüllen.

Ich habe das so versucht:

Code:
for (int i=0; i < 3; i++){
           TableRow tr = new TableRow(this);
           tr.setLayoutParams(new LayoutParams(
                          LayoutParams.FILL_PARENT,
                          LayoutParams.WRAP_CONTENT));
           for (int y=0; y < 9; y++){
               EditText et = new EditText(this);
               et.setLayoutParams(new LayoutParams(
                       LayoutParams.WRAP_CONTENT,
                       LayoutParams.WRAP_CONTENT));
               et.setText(" ");
               ll.addView(et);
           }
 }
Dabei Sollten 9 Zeilen und 9 Spalten entstehen, was aber irgendwie nicht will, wie ich es will. Je nach dem ob ich beim Layout VERTICAL oder HORIZONTAL angebe erscheint zwar die richtige Anzahl Felder, aber alle auf einer Zeile bzw. in einer Spalte.

Sollte es nicht eine relativ simple lösung dafür geben?

Danke & Sorry falls es dumme Fragen sind ;)

Gruss kbob
 
An deiner Stelle würde ich den TableRow zum Container hinzufügen:
Code:
 for (int i = 0; i < FIELD_SIZE; i++) {
            row = new TableRow(this);
            layoutParams = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT);
            row.setLayoutParams(layoutParams);
            panel.addView(row);
 
Hi... erstma danke für die Antwort.
Der einzige Unterschied, den ich sehe ist das panel.addview...
Was genau bewirkt das?

Vielleicht habe ich mich nicht deutlich genug ausgedrückt.
Es geht darum, dass man in eine 9x9 grosse Tabelle die Werte eines Sudokus eingeben kann...

Danke & Gruss
kbob
 
Also, der TableRow muss auch irgendwochin hinzugefügt werden ( in diesen Fall zu einen Panel )
Wie es dann aussient kannst du bei dem Lines-Spiel ansehen (Link funktioniert von dem Android-Gerät) - es ist Copy-PAste azs dem Quellkode.
 
naja, hab kein android gerät =)

ich verstehe einfach nicht, was ich mit dem layout machen muss, damit 9 Zeilen mit 9 Felder entstehen (Sudoku)...
Update:
So wird gar nichts angezeigt.
Code:
       ScrollView sv = new ScrollView(this);
       LinearLayout ll = new LinearLayout(this);
       ll.setOrientation(LinearLayout.HORIZONTAL);
       sv.addView(ll);

       TableLayout table = (TableLayout) findViewById(R.id.InputTable);
       table.setColumnStretchable(0, true);
       table.setColumnCollapsed(0, true);
       
       for (int i=0; i < 9; i++){
           TableRow tr = new TableRow(this);
           tr.setLayoutParams(new LayoutParams(
                          LayoutParams.FILL_PARENT,
                          LayoutParams.WRAP_CONTENT));
           ll.addView(tr);

           for (int y=0; y < 9; y++){
               EditText et = new EditText(this);
               et.setLayoutParams(new LayoutParams(
                       LayoutParams.WRAP_CONTENT,
                       LayoutParams.WRAP_CONTENT));
               et.setText("01");
               ll.addView(et);
           }
       }

       this.setContentView(sv);
 
Zuletzt bearbeitet:
An deiner Stelle würde ich die tr (TableRow) zum Table (table) hinzufügen:

table.addView(tr);

Anstatt es direkt zum parent (in deinen Fall - ll ). So wie du es machst, wird nur der letzte TableRow sichtbar (wenn überhaupt - IIRC benötigt es eine Table um hunzugefügt zu werden )
 
Ändert auch nichts...
Folgendes setzt anstatt auf 2 Zeilen je 2 Felder, auf 1 Zeile 4 Fenster.......

Code:
       ScrollView sv = new ScrollView(this);
       LinearLayout ll = new LinearLayout(this);
       ll.setOrientation(LinearLayout.HORIZONTAL);
       sv.addView(ll);

       TableLayout table = (TableLayout) findViewById(R.id.InputTable);
       table.setColumnStretchable(0, true);
       table.setColumnCollapsed(0, true);
       
       for (int i=0; i < 2; i++){
           TableRow tr = new TableRow(this);
           tr.setLayoutParams(new LayoutParams(
                          LayoutParams.FILL_PARENT,
                          LayoutParams.WRAP_CONTENT));
           table.addView(tr);

           for (int y=0; y < 2; y++){
               EditText et = new EditText(this);
               et.setLayoutParams(new LayoutParams(
                       LayoutParams.WRAP_CONTENT,
                       LayoutParams.WRAP_CONTENT));
               et.setText("01");
               ll.addView(et);
           }
       }

       this.setContentView(sv);
   }
 
Jetzt hast du rows zum Tabelle hinzugefügt, aber nicnt die Tabelle zum LinearLayout ;)
 
Ok Ok, langsam verstehe ich diese Hierarchie ;)
Aber jetzt, wo ich denke alles richtig hinzugefügt zu haben, bekomme ich eine Force Close Meldung...

Code:
       ScrollView sv = new ScrollView(this);
       LinearLayout ll = new LinearLayout(this);
       ll.setOrientation(LinearLayout.HORIZONTAL);
       sv.addView(ll);

       TableLayout table = (TableLayout) findViewById(R.id.InputTable);
       table.setColumnStretchable(0, true);
       table.setColumnCollapsed(0, true);
       
       for (int i=0; i < 2; i++){
           TableRow tr = new TableRow(this);
           tr.setLayoutParams(new LayoutParams(
                          LayoutParams.FILL_PARENT,
                          LayoutParams.WRAP_CONTENT));
           for (int y=0; y < 2; y++){
               EditText et = new EditText(this);
               et.setLayoutParams(new LayoutParams(
                       LayoutParams.WRAP_CONTENT,
                       LayoutParams.WRAP_CONTENT));
               et.setText("01");
               tr.addView(et); //edittext wird der tablerow hinzugefügt
               
           }
           table.addView(tr); //tablerow wird der table hinzugefügt
       }
       ll.addView(table); //table wird dem linearlayout hinzugefügt
       this.setContentView(sv);
   }
 
Da keiner hier der Telepathie und Hellseherei mächtig
ist ( zumindest hat sich noch keiner geoutet ) - solltest du
auch eine Stacktrace aus der Console / adb posten

Aber wahrscheinlich hasst du eine NPE verursacht, oder so was ähnliches.
 
meinst du das? habe einfach paket gefiltert...

Code:
07-21 18:25:05.892: INFO/PackageParser(59): sudokusolver.example.com: compat added android.permission.WRITE_EXTERNAL_STORAGE android.permission.READ_PHONE_STATE
07-21 18:25:24.200: INFO/PackageParser(59): sudokusolver.example.com: compat added android.permission.WRITE_EXTERNAL_STORAGE android.permission.READ_PHONE_STATE
07-21 18:25:26.929: INFO/PackageManager(59): Removing non-system package:sudokusolver.example.com
07-21 18:25:27.528: DEBUG/PackageManager(59): Scanning package sudokusolver.example.com
07-21 18:25:27.528: INFO/PackageManager(59): Package sudokusolver.example.com codePath changed from /data/app/sudokusolver.example.com-1.apk to /data/app/sudokusolver.example.com-2.apk; Retaining data and using new
07-21 18:25:27.538: INFO/PackageManager(59): /data/app/sudokusolver.example.com-2.apk changed; unpacking
07-21 18:25:27.558: DEBUG/installd(35): DexInv: --- BEGIN '/data/app/sudokusolver.example.com-2.apk' ---
07-21 18:25:27.879: DEBUG/installd(35): DexInv: --- END '/data/app/sudokusolver.example.com-2.apk' (success) ---
07-21 18:25:27.879: WARN/PackageManager(59): Code path for pkg : sudokusolver.example.com changing from /data/app/sudokusolver.example.com-1.apk to /data/app/sudokusolver.example.com-2.apk
07-21 18:25:27.879: WARN/PackageManager(59): Resource path for pkg : sudokusolver.example.com changing from /data/app/sudokusolver.example.com-1.apk to /data/app/sudokusolver.example.com-2.apk
07-21 18:25:27.890: DEBUG/PackageManager(59):   Activities: sudokusolver.example.com.SudokuSolver
07-21 18:25:27.999: INFO/installd(35): move /data/dalvik-cache/data@app@sudokusolver.example.com-2.apk@classes.dex -> /data/dalvik-cache/data@app@sudokusolver.example.com-2.apk@classes.dex
07-21 18:25:28.009: DEBUG/PackageManager(59): New package installed in /data/app/sudokusolver.example.com-2.apk
07-21 18:25:28.769: INFO/ActivityManager(59): Force stopping package sudokusolver.example.com uid=10031
07-21 18:25:28.901: INFO/ActivityManager(59): Force stopping package sudokusolver.example.com uid=10031
07-21 18:25:29.618: INFO/ActivityManager(59): Force stopping package sudokusolver.example.com uid=10031
07-21 18:25:31.039: INFO/installd(35): unlink /data/dalvik-cache/data@app@sudokusolver.example.com-1.apk@classes.dex
07-21 18:25:32.929: INFO/ActivityManager(59): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=sudokusolver.example.com/.SudokuSolver }
07-21 18:25:32.989: INFO/ActivityManager(59): Start proc sudokusolver.example.com for activity sudokusolver.example.com/.SudokuSolver: pid=281 uid=10031 gids={1015}
07-21 18:25:33.949: ERROR/AndroidRuntime(281): java.lang.RuntimeException: Unable to start activity ComponentInfo{sudokusolver.example.com/sudokusolver.example.com.SudokuSolver}: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
07-21 18:25:33.949: ERROR/AndroidRuntime(281):     at sudokusolver.example.com.SudokuSolver.onCreate(SudokuSolver.java:47)
07-21 18:25:33.989: WARN/ActivityManager(59):   Force finishing activity sudokusolver.example.com/.SudokuSolver
07-21 18:25:34.538: WARN/ActivityManager(59): Activity pause timeout for HistoryRecord{43e5a630 sudokusolver.example.com/.SudokuSolver}
07-21 18:25:44.578: WARN/ActivityManager(59): Activity destroy timeout for HistoryRecord{43e5a630 sudokusolver.example.com/.SudokuSolver}
07-21 18:27:56.809: INFO/ActivityManager(59): Process sudokusolver.example.com (pid 281) has died.
07-21 18:28:21.051: INFO/ActivityManager(59): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=sudokusolver.example.com/.SudokuSolver }
07-21 18:28:21.269: INFO/ActivityManager(59): Start proc sudokusolver.example.com for activity sudokusolver.example.com/.SudokuSolver: pid=659 uid=10031 gids={1015}
07-21 18:28:22.409: ERROR/AndroidRuntime(659): java.lang.RuntimeException: Unable to start activity ComponentInfo{sudokusolver.example.com/sudokusolver.example.com.SudokuSolver}: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
07-21 18:28:22.409: ERROR/AndroidRuntime(659):     at sudokusolver.example.com.SudokuSolver.onCreate(SudokuSolver.java:47)
07-21 18:28:22.429: WARN/ActivityManager(59):   Force finishing activity sudokusolver.example.com/.SudokuSolver
07-21 18:28:22.929: WARN/ActivityManager(59): Activity pause timeout for HistoryRecord{4402e4f0 sudokusolver.example.com/.SudokuSolver}
07-21 18:28:26.348: INFO/ActivityManager(59): Process sudokusolver.example.com (pid 659) has died.
07-21 18:28:33.539: WARN/ActivityManager(59): Activity destroy timeout for HistoryRecord{4402e4f0 sudokusolver.example.com/.SudokuSolver}
07-21 18:28:36.479: INFO/ActivityManager(59): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=sudokusolver.example.com/.SudokuSolver }
07-21 18:28:36.538: INFO/ActivityManager(59): Start proc sudokusolver.example.com for activity sudokusolver.example.com/.SudokuSolver: pid=721 uid=10031 gids={1015}
07-21 18:28:37.799: ERROR/AndroidRuntime(721): java.lang.RuntimeException: Unable to start activity ComponentInfo{sudokusolver.example.com/sudokusolver.example.com.SudokuSolver}: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
07-21 18:28:37.799: ERROR/AndroidRuntime(721):     at sudokusolver.example.com.SudokuSolver.onCreate(SudokuSolver.java:47)
07-21 18:28:38.069: WARN/ActivityManager(59):   Force finishing activity sudokusolver.example.com/.SudokuSolver
07-21 18:28:38.589: WARN/ActivityManager(59): Activity pause timeout for HistoryRecord{43fda6d0 sudokusolver.example.com/.SudokuSolver}
07-21 18:28:40.622: INFO/ActivityManager(59): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=sudokusolver.example.com/.SudokuSolver }
07-21 18:28:40.889: INFO/ActivityManager(59): Process sudokusolver.example.com (pid 721) has died.
07-21 18:28:40.899: INFO/UsageStats(59): Unexpected resume of com.android.launcher while already resumed in sudokusolver.example.com
07-21 18:28:49.091: WARN/ActivityManager(59): Activity destroy timeout for HistoryRecord{43fda6d0 sudokusolver.example.com/.SudokuSolver}
 
Also, es steht da im Klartext:

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

Du kanns sicherlich von dem Stacktrace ensprechende Strelle finden
 
Hallo

Sorry für die lange Sendepause, war im Urlaub.

Naja ich muss ehrlich gesagt zugeben, dass ich mit dem Remove View nicht umzugehen weiß, und auch von der Logik her nicht verstehe wohin das (sinnvollerweise) sollen komm.
 
Zuletzt bearbeitet von einem Moderator:
wenn ein View bereits einen Parent gesetzt hat, kann es nicht mehr zu anderen View als Child hinzugef[gt werden ( zum Beispiel mit setParent() oder addView())
 
Code:
       setContentView(R.layout.main);
       ScrollView sv = new ScrollView(this);
       LinearLayout ll = new LinearLayout(this);
       ll.setOrientation(LinearLayout.HORIZONTAL);
       sv.addView(ll);

       TableLayout table = (TableLayout) findViewById(R.id.InputTable);
       table.setColumnStretchable(0, true);
       table.setColumnCollapsed(0, true);
       
       for (int i=0; i < 2; i++){
           TableRow tr = new TableRow(this);
           tr.setLayoutParams(new LayoutParams(
                          LayoutParams.FILL_PARENT,
                          LayoutParams.WRAP_CONTENT));
           for (int y=0; y < 2; y++){
               EditText et = new EditText(this);
               et.setLayoutParams(new LayoutParams(
                       LayoutParams.WRAP_CONTENT,
                       LayoutParams.WRAP_CONTENT));
               et.setText("01");
               tr.addView(et); //edittext wird der tablerow hinzugefügt
           }
           table.addView(tr); //tablerow wird der table hinzugefügt
       }
       ll.addView(table); //table wird dem linearlayout hinzugefügt
       this.setContentView(sv);
   }

Aber das passiert ja in diesem Code gar nich...
Eine Tabellenzeile wird erstellt, es werden 9 Edittexts in diese Tabellenzeile erstellt, die Tabellenzeile wird der Tabelle hinzugefügt.
Das ganze einfach 9 mal...
Wo mache ich den Denkfehler??

Gruss & Danke
 

Ähnliche Themen

R
Antworten
6
Aufrufe
994
swa00
swa00
T
  • Gesperrt
  • trini
Antworten
5
Aufrufe
815
swa00
swa00
H
Antworten
4
Aufrufe
718
heikoj10.1
H
Zurück
Oben Unten