[JAVA / Android] GUI probleem XML -> JAVA

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • martijn2008
  • Registratie: December 2009
  • Laatst online: 21-08-2022
Ik ben bezig met het maken van een app voor Android. Het is me eerste app die ik steeds verder probeer uit te breiden. Wat de app moet doen een X aantal counters op 1 scherm weergeven. Wat ik nu heb is een werkend layout in XML, maar omdat ik graag een variabel aantal counters wil hebben, wil ik me layout opbouwen d.m.v Java i.p.v. XML. Hoe de layout er uit moet zijn:
  • TableLayout
    • TableRow
      • LinearLayout
        • Button
        • TextView
        • Button
      • LinearLayout
        • Button
        • TextView
        • Button
    • TableRow
      • LinearLayout
        • Button
        • TextView
        • Button
      • LinearLayout
        • Button
        • TextView
        • Button
Dat is de basis die ik nu wil maken via Java, voordat ik het aantal counters echt variabel heb. Elke LinearLayout is dus eigenlijk een counter. Met 2 knopjes en een textview. De TableLayout moet er dan voor zorgen dat alles mooi uitgelijnt is. En dat werkt ook naar tevredenheid. Ik heb elke TableRow een weightSum van 100 gegeven. En ik wil elke LinearLayout een weight geven van 50. Hier de Java code waarmee ik dat wil bereiken.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// package en imports
// de MenuButton class extends Activity
public class StartPoint extends MenuButton {
    public static final String filename = "settingsFile";
    SharedPreferences dataSettings;
    int[] number = new int[4];
    Button[] add = new Button[4];
    Button[] sub = new Button[4];
    LinearLayout[] linearL = new LinearLayout[4];
    TextView[] display = new TextView[4];
    TableLayout mainTableLayout;    
    TableRow[] tableRow = new TableRow[2];
    
    boolean saving;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mainTableLayout = (TableLayout) findViewById(R.id.mainTableLayout);
        tableRow[0] = new TableRow(this);
        tableRow[1] = new TableRow(this);
        tableRow[0].setWeightSum(100);
        tableRow[1].setWeightSum(100);
        tableRow[0].setLayoutParams(new TableRow.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
        tableRow[1].setLayoutParams(new TableRow.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
        mainTableLayout.addView(tableRow[0]);
        mainTableLayout.addView(tableRow[1]);
        
        for(int j=0; j<=3; j++){
            // convert j to a final integer
            final int i = new Integer(j);
            
            linearL[i] = new LinearLayout(this);
            add[i] = new Button(this);
            sub[i] = new Button(this);
            display[i] = new TextView(this);
            
            add[i].setText("+");
            sub[i].setText("-");
            display[i].setTextSize(TypedValue.COMPLEX_UNIT_DIP,45);
            sub[i].setTextSize(TypedValue.COMPLEX_UNIT_DIP,35);
            add[i].setTextSize(TypedValue.COMPLEX_UNIT_DIP,35);
            
            linearL[i].setOrientation(LinearLayout.VERTICAL);
            display[i].setGravity(Gravity.CENTER);
            add[i].setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
            sub[i].setLayoutParams(new ViewGroup.LayoutParams(200,LayoutParams.MATCH_PARENT));
            linearL[i].setLayoutParams(new LinearLayout.LayoutParams(0,0,50)); // als ik deze weghaal dan doet hij het, maar dan werkt de weightsum
//linearL[i].setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT,50)); had ik eerst, maar dat geeft hetzelfde effect
            
            linearL[i].addView(add[i]);
            linearL[i].addView(display[i]);
            linearL[i].addView(sub[i]);
            tableRow[i%2].addView(linearL[i]);
           }
    }
}


Ik hoop dat ik alle irrilevante code heb weggehaalt en alle relevante code heb laten staan. Voor de volledigheid hier een link naar de XML-layout http://codeviewer.org/view/code:27d4 en hier de link naar het volledige Java bestand.http://codeviewer.org/view/code:27d5

Ik heb met de Hierarchy Viewer gekeken, maar dan zie je ook niets, wel de hele "boom" van alle elementen. De "boom" ziet er hetzelfde uit als ik die ene regel code niet gebruik. Als ik het een beetje verander zodat de helft van de buttons buiten het scherm vallen, dan is dat met the Hierarchy Viewer te zien, maar met die ene regel code is helemaal geen enkele button te zien.

Nou ik hoop dat dit een goede topic start is en als er documentatie over dit onderwerp gaat waar misschien de oorzaak van dit probleem in te vinden is dan hoor ik het graag. Alvast wil ik jullie bedanken voor de reacties.

Acties:
  • 0 Henk 'm!

  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 31-05 22:24

Wijnbo

Electronica werkt op rook.

Laat je imports eens zien ;-)

Ik durf te wedden dat daar import android.widget.TableLayout.LayoutParams bij staat.

[ Voor 60% gewijzigd door Wijnbo op 09-07-2012 13:15 ]


Acties:
  • 0 Henk 'm!

  • martijn2008
  • Registratie: December 2009
  • Laatst online: 21-08-2022
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;


dus het ligt aan de imports? Dat klinkt mij vreemd in de oren.

edit: Ik heb dit gelezen http://stackoverflow.com/...ly-added-does-not-display, volgens mij is dat een soortgelijk probleem. Maar ik zie nog niet helemaal wat ik zou moet veranderen en wat er precies fout gaat. De LayoutParams worden uit de verkeerde geïmporteerd waardoor er iets fout gaat, maar ik zou niet weten wat ik moet veranderen. Heb naar mijn idee alles al geprobeerd.

[ Voor 29% gewijzigd door martijn2008 op 09-07-2012 19:37 ]


Acties:
  • 0 Henk 'm!

  • P-Storm
  • Registratie: September 2006
  • Laatst online: 29-05 09:51
Java:
1
2
add[i].setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
 

Java:
1
tr.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT,TableLayout.LayoutParams.WRAP_CONTENT));

Zoals in die voorbeeld wordt aangegeven, heb je van TableLayout de enums nodig, en volngs mij met jou impiorts dat er andere gebruikt wordt (LinearLayout?)

Acties:
  • 0 Henk 'm!

  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 31-05 22:24

Wijnbo

Electronica werkt op rook.

Van : http://en.androidwiki.com...ding_rows_to_TableLayout:

*Please note that you must "import android.widget.TableRow.LayoutParams" and NOT 'import android.widget.TableLayout.LayoutParams' or another LayoutParams class. If you use the wrong LayoutParams class, then the rows won't be shown probably.

Maar dit doe je al zie ik. Wat je volgens mij niet doet, is LayoutParams mee geven aan de TableLayout.

Probeer dit eens?

Java:
1
2
3
4
5
6
mainTableLayout.addView(tableRow[0],new TableLayout.LayoutParams(
                    LayoutParams.FILL_PARENT,
                    LayoutParams.WRAP_CONTENT));
        mainTableLayout.addView(tableRow[1],new TableLayout.LayoutParams(
                    LayoutParams.FILL_PARENT,
                    LayoutParams.WRAP_CONTENT)); 

[ Voor 52% gewijzigd door Wijnbo op 10-07-2012 09:40 ]


Acties:
  • 0 Henk 'm!

  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 31-05 22:24

Wijnbo

Electronica werkt op rook.

-dubbel-

[ Voor 255% gewijzigd door Wijnbo op 10-07-2012 09:40 ]


Acties:
  • 0 Henk 'm!

  • JustAnotherDev
  • Registratie: Augustus 2004
  • Laatst online: 21:42
Voor de snippet hierboven.
Uit mijn hoofd maar volgens mij moet je het LayoutParams type nemen van de parent waarin de child genest is.
Dus als je een View object in een Relativelayout plaatst, geeft je het childView object RelativeLayout.LayoutParams.

Daarnaast denk ik niet dat het gaat lukken wat je wilt bereiken met de TableLayout en TableRows. Heb het zelf ook eens gehad waarbij ik een RelativeLayout container in de 2e kolom plaatste van een TableRow in combinatie met match_parent. Zie ook bijvoorbeeld http://stackoverflow.com/...elements-going-off-screen.

Tevens voor de opzet die jij wilt zou ik niet eens kiezen voor een TableLayout. Je view hierarchy is niet het meest efficiënt. Zeker wanneer je viewgroups gebruikt met weightsums, tijdens het opmaken van de layout alles 2 keer opgemeten moet worden, http://developer.android....ts/optimizing-layout.html. (Nu geldt dit voornamelijk als je echt heel heel veel view objecten aanmaakt, want in de praktijk merkt je met een paar knoppen er niet veel van.)

Beste optie is het gebruik van een RelativeLayout, of wanneer je het scherm in gelijke vlakken in wilt delen bijvoorbeeld een LinearLayout in een LinearLayout, of GridView afhankelijk van de api die je gebruikt.
Maak anders even een schets van wat je precies wilt qua layout, omdat zo het lastig te bepalen is wat de beste keuze is.

edit:
Trouwens. Wat is de reden dat je perse de layout in Java wil aanmaken ten opzichte van het gebruik van XML. Tenzij je rijen en knoppen dynamisch toevoegt, is het gebruik van XML of Java niet anders. Kijk anders maar naar de constructor van View objecten binnen Android. Tijdens het inflaten worden de attributen gedefinieerd in XML, gewoon gebruikt voor het aanmaken van de View objecten. Daarbij maakt het maken van de layout in XML overzichtelijker doordat je gebruik kan maken van de "Graphical Layout" preview.
Mocht je knoppen dynamisch willen toevoegen,zou ik weer kijken naar naar het gebruik van een Listview oid vanwege performance ed, in tegenstelling tot het gebruik van LinearLayouts en RelativeLayouts.

[ Voor 20% gewijzigd door JustAnotherDev op 10-07-2012 10:56 ]


Acties:
  • 0 Henk 'm!

  • martijn2008
  • Registratie: December 2009
  • Laatst online: 21-08-2022
Ik wil de elementen dynamisch toevoegen vooral om dit te oefenen, maar ook omdat ik de gebruiker de keus wil geven te kiezen hoeveel counters er in het scherm worden weergegeven. Op een tablet zou je voor meer kunnen kiezen, voor een kleine telefoon hooguit 1. Het probleem was inderdaad dat ik de verkeerde class heb geïmporteerd. Wat ik wel vreemd vind is dat het dan niet nodig is voor de LinearLayout. Ik zou zeggen allebei de klassen, maar blijkbaar niet dus. En ik heb voor deze hiërarchie gekozen omdat mij dit logisch/makkelijkst leek. Maar ik zal voor volgende projectjes kijken hoe het ook anders kan. Wat ik wil is nu helemaal bereikt, want het is nu precies het zelfde zoals ik het eerst in XML gemaakt had.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TableRow.LayoutParams;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;


Allen dank voor de reacties, had de hoop al bijna opgegeven.

PS. nu ik toch een topic heb gemaakt, iemand enig idee waarom de icoontjes in mijn menu in het virtual device niet worden weergegeven en op me telefoon wel? Alles ziet er verder het zelfde uit, als ik het goed heb draaien ze allebei op Android 4.0.3

[ Voor 9% gewijzigd door martijn2008 op 10-07-2012 18:49 ]

Pagina: 1