Stellen Sie das Layoutgewicht einer Textansicht programmgesteuert ein

214

Ich versuche, TableRowObjekte dynamisch zu erstellen und zu einem hinzuzufügen TableLayout. Das TableRowObjekt hat 2 Elemente, a TextViewund a CheckBox. Für die TextViewElemente muss das Layoutgewicht auf 1 gesetzt sein, damit die CheckBoxElemente ganz nach rechts verschoben werden.

Ich kann keine Dokumentation zum programmgesteuerten Festlegen des Layoutgewichts eines TextViewElements finden.

Eugen
quelle

Antworten:

355

Sie müssen TableLayout.LayoutParamsmit so etwas verwenden:

TextView tv = new TextView(v.getContext());
tv.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1f));

Der letzte Parameter ist das Gewicht.

Macarse
quelle
15
Ich habe das vorher nicht erwähnt, also tut es mir leid. Aber ich habe es versucht, bevor ich meine Frage gestellt habe. Dadurch verschwindet die Textansicht aus dem Layout. Positiv ist jedoch zu vermerken, dass das Festlegen der Eigenschaft strip_columns des TableLayout auf 0 den gewünschten Effekt verursacht (TextView links, CheckBoxes rechts). Danke für die Hilfe.
Eugene
8
Wenn Sie ein XML-Layout importieren und Ihr Layout nicht dynamisch erstellen, können Sie es folgendermaßen abrufen:TextView tv = (TextView) findViewById(R.id.your_textview_inside_the_linearlayout); tv.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 0.1f));
Eric Leschinski
5
Um das Layoutgewicht programmgesteuert einzustellen, TableRow.LayoutParamssollte anstelle von verwendet werden TableLayout.LayoutParams. Siehe @ Dorjes Antwort.
Halil
android.widget.LinearLayout importieren; android.widget.TableLayout importieren;
Prakash
1
Beachten Sie, dass die meisten Benutzer 0 als ersten oder zweiten Parameter verwenden würden (je nachdem, ob horizontal oder vertikal) und nicht WRAP_CONTENT, da sie das Gewicht festlegen möchten.
FlorianB
97

Die Antwort ist, dass Sie TableRow.LayoutParams verwenden müssen, nicht LinearLayout.LayoutParams oder andere LayoutParams.

TextView tv = new TextView(v.getContext());
LayoutParams params = new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
tv.setLayoutParams(params);

Die verschiedenen LayoutParams sind nicht austauschbar. Wenn Sie das falsche verwenden, scheint nichts zu passieren. Das übergeordnete Element der Textansicht ist eine Tabellenzeile.

http://developer.android.com/reference/android/widget/TableRow.LayoutParams.html

Dorje
quelle
Diese Antwort hat mir sehr geholfen ... TableLayout hat bei mir nicht funktioniert
sham.y
Oh Mann, du hast mir so viel Zeit gespart. Wo ist es angegeben? Ich habe nichts in der Dokumentation gefunden, dass Sie nicht austauschen könnenLayoutParams
Adrien Cadet
TableRow.LayoutParamshat den Job auch für mich gemacht
Menelaos Kotsollaris
6
Der Schlüsselteil dieser Antwort ist die 0
Leon
Es wird meine Arbeitszeit reduzieren. Ich suche für eine lange Zeit. Sehr gute Lösung
SIVAKUMAR.J
38

In den früheren Antworten wird das Gewicht an den Konstruktor eines neuen SomeLayoutType.LayoutParams-Objekts übergeben. In vielen Fällen ist es jedoch bequemer, vorhandene Objekte zu verwenden - es hilft, den Umgang mit Parametern zu vermeiden, an denen wir nicht interessiert sind.

Ein Beispiel:

// Get our View (TextView or anything) object:
View v = findViewById(R.id.our_view); 

// Get params:
LinearLayout.LayoutParams loparams = (LinearLayout.LayoutParams) v.getLayoutParams();

// Set only target params:
loparams.height = 0;
loparams.weight = 1;
v.setLayoutParams(loparams);
sberezin
quelle
loparams könnten NULL sein, also stellen Sie sicher, dass Sie dies überprüfen, bevor Sie setLayoutParams ()
AAgg
@ AAgg, nicht in einer praktischen Situation. Die Ansicht wäre nicht aufgeblasen, wenn Breite und Höhe nicht eingestellt worden wären. Aber ich stimme zu - es ist eine gute Praxis, zu überprüfen, ob Zweifel an Null bestehen.
sberezin
16
TextView txtview = new TextView(v.getContext());
LayoutParams params = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
txtview.setLayoutParams(params);

1f bedeutet als Gewicht = 1; Sie können 2f oder 3f angeben. Ansichten werden entsprechend dem Leerzeichen verschoben


quelle
12

Stellen Sie einfach Layout-Parameter in diesem Layout wie ein

Parametervariable erstellen

 android.widget.LinearLayout.LayoutParams params = new android.widget.LinearLayout.LayoutParams(
            LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1f);

1f ist gewichtsvariabel

Stellen Sie Ihr Widget oder Layout wie ein

 TextView text = (TextView) findViewById(R.id.text);
 text.setLayoutParams(params);
Manikandan
quelle
Woher bekommen Sie diese Information, dass 1f die Gewichtsvariable bedeutet? Können Sie bitte einen Link angeben?
Hayonj
@ Hayonj überprüfen Sie nur die Quellen des LinearLayout.LayoutParamsKonstruktors. 3. Parameter ist Gewicht. Oder Dokumentation
Mente
11
TextView text = new TextView(v.getContext());
text.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 
                                                LayoutParams.WRAP_CONTENT, 1f));

(ODER)

TextView tv = new TextView(v.getContext());
LayoutParams params = new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
tv.setLayoutParams(params);

1f wird als Gewicht = 1 bezeichnet; Je nach Bedarf können Sie 2f oder 3f angeben. Die Ansichten werden entsprechend dem Leerzeichen verschoben. Verwenden Sie die Gewichtsumme für "LinearLayout" , um den angegebenen Abstand zwischen Ansichten im linearen Layout festzulegen.

LinearLayout ll_Outer= (LinearLayout ) view.findViewById(R.id.linearview);
LinearLayout llInner = new LinearLayout(this);
            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FillParent, LinearLayout.LayoutParams.WrapContent);
            llInner.Orientation = Orientation.Horizontal;
            llInner.WeightSum = 2;
            ll_Outer.AddView(llInner);
anand krish
quelle
8

Dies sollte für Sie funktionieren

LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT LayoutParams.MATCH_PARENT);

param.weight=1.0f;
Ashok Reddy M.
quelle
7

Sie können das Gewicht auch separat wie folgt angeben:

LayoutParams lp1 = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);

 lp1.weight=1;
kiran boghra
quelle
6

Diese Arbeit für mich, und ich hoffe, es wird auch für Sie funktionieren

Legen Sie zuerst die LayoutParams für die übergeordnete Ansicht fest:

myTableLayout.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.FILL_PARENT,
                TableLayout.LayoutParams.FILL_PARENT));

Stellen Sie dann für die Textansicht (untergeordnetes Element) Folgendes ein:

 TableLayout.LayoutParams textViewParam = new TableLayout.LayoutParams
     (TableLayout.LayoutParams.WRAP_CONTENT,
     TableLayout.LayoutParams.WRAP_CONTENT,1f);
     //-- set components margins
     textViewParam.setMargins(5, 0, 5,0);
     myTextView.setLayoutParams(textViewParam); 
Najem1234
quelle
1

Es gibt einen anderen Weg, dies zu tun. Falls Sie nur einen Parameter einstellen müssen, zum Beispiel 'height':

TextView textView = (TextView)findViewById(R.id.text_view);
ViewGroup.LayoutParams params = textView.getLayoutParams();
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
textView.setLayoutParams(params);
Dmitry
quelle
1

Nach 4 Stunden Kampf. Schließlich hat dieser Code für mich funktioniert.

3 Spalten befinden sich in einer Reihe.

  TextView serialno = new TextView(UsersActivity.this);
  TextView userId = new TextView(UsersActivity.this);
  TextView name = new TextView(UsersActivity.this);

  serialno.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));
  userId.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));
  name.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));
Gulshan Yadav
quelle
-1

Ich hatte ziemlich große Schwierigkeiten mit einer Lösung, die dieser sehr ähnlich war: Ich versuchte, zwei Schaltflächen in einer TableRow zu haben, von denen jede die Hälfte der Bildschirmbreite hatte. Aus irgendeinem Grund würde die linke Taste immer etwa 70% der Breite und die rechte Taste 30% betragen. Das Aufrufen von table_layout.setStretchAllColumns (true) hatte weder Auswirkungen noch das Festlegen der Breite der Schaltfläche auf die Hälfte des Bildschirms oder das Festlegen des Layoutgewichts.

Die Lösung , die ich am Ende mit wurde ein Linearlayout in den TableRows nisten, die hat sich der Wert der Tasten Breite zu berücksichtigen.

    TableLayout layout = new TableLayout(this);
    TableRow top_row = new TableRow(this);
    left_button = styleButton();
    right_button = styleButton();
    LinearLayout toprow_layout = new LinearLayout (this);
    toprow_layout.setOrientation(LinearLayout.HORIZONTAL);
    toprow_layout.addView (left_button);
    toprow_layout.addView(right_button);
    toprow.addView(top_layout);
    layout.addView(top_row)

    private Button styleButton() {
            Button btn = new Button (this);
            android.view.Display display = ((android.view.WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();      
            btn.setWidth((int)(display.getWidth()/2));    // set width to half
            btn.setHeight(((int)display.getHeight()/6));  // set height to whatevs
            btn.setText("foo");
            return btn;
        }
joseph_morris
quelle
1
Nur damit Sie für die Zukunft wissen, ist die Lösung , die die TableRow, Button1 zu setzen und Button2 auf alle haben layout_width=fill_parent, und danach zu tun, setzen die layout_weight=1beiden für button1 und button2. Alle Elemente mit fill_parent und layout_weight = 1 erhalten beim Aufblasen die gleiche Größe.
3.