1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

2D Array abfüllen

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von kbob, 18.07.2010.

  1. kbob, 18.07.2010 #1
    kbob

    kbob Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    18.07.2010
    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
     
  2. ko5tik, 18.07.2010 #2
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    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);
    
     
  3. kbob, 18.07.2010 #3
    kbob

    kbob Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    18.07.2010
    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
     
  4. ko5tik, 18.07.2010 #4
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    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.
     
  5. kbob, 18.07.2010 #5
    kbob

    kbob Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    18.07.2010
    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: 18.07.2010
  6. ko5tik, 19.07.2010 #6
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    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 )
     
  7. kbob, 20.07.2010 #7
    kbob

    kbob Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    18.07.2010
    Ä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);
       }
    
     
  8. ko5tik, 20.07.2010 #8
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    Jetzt hast du rows zum Tabelle hinzugefügt, aber nicnt die Tabelle zum LinearLayout ;)
     
  9. kbob, 20.07.2010 #9
    kbob

    kbob Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    18.07.2010
    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);
       }
    
     
  10. ko5tik, 21.07.2010 #10
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    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.
     
  11. kbob, 22.07.2010 #11
    kbob

    kbob Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    18.07.2010
    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}
    
    
     
  12. ko5tik, 22.07.2010 #12
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    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
     
  13. kbob, 02.08.2010 #13
    kbob

    kbob Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    18.07.2010
    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 von einem Moderator bearbeitet: 03.11.2012
  14. ko5tik, 02.08.2010 #14
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    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())
     
  15. kbob, 04.08.2010 #15
    kbob

    kbob Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    18.07.2010
    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
     

Diese Seite empfehlen