Programowo ustaw wagę układu TextView

214

Próbuję dynamicznie tworzyć TableRowobiekty i dodawać je do pliku TableLayout. Te TableRowobiekty znajdują się 2 elementy, A TextViewi CheckBox. Przedmioty TextViewmuszą mieć ustawioną wagę układu na 1, aby przesunąć CheckBoxje w prawą stronę.

Nie mogę znaleźć dokumentacji, jak programowo ustawić wagę układu TextViewelementu.

eugen
źródło

Odpowiedzi:

355

Musisz użyć TableLayout.LayoutParamsczegoś takiego:

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

Ostatnim parametrem jest waga.

Makaron
źródło
15
Nie wspominałem o tym wcześniej, więc przepraszam. Ale spróbowałem tego, zanim zadałem pytanie. Powoduje to, że TextView znika z układu. Ale, pozytywnie, stwierdziłem, że ustawienie właściwości stretch_columns obiektu TableLayout na 0 powoduje efekt, którego szukam (TextView po lewej, CheckBoxes po prawej). Dzięki za pomoc.
eugene
8
Jeśli importujesz układ XML i nie tworzysz go dynamicznie, możesz go pobrać w następujący sposób: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
Aby programowo ustawić wagę układu, TableRow.LayoutParamsnależy użyć zamiast TableLayout.LayoutParams. Zobacz odpowiedź @ Dorje.
Halil
import android.widget.LinearLayout; import android.widget.TableLayout;
Prakash,
1
Zauważ, że większość ludzi użyłaby 0 jako pierwszego lub drugiego parametru (w zależności od tego, czy jest to pozioma czy pionowa), a nie WRAP_CONTENT, ponieważ to, czego szukają, to ustawić wagę.
FlorianB
97

Odpowiedź jest taka, że ​​musisz użyć TableRow.LayoutParams, a nie LinearLayout.LayoutParams lub dowolnego innego LayoutParams.

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

Różne LayoutParams nie są wymienne, a jeśli użyjesz niewłaściwego, nic się nie wydarzy. Element nadrzędny widoku tekstowego jest wierszem tabeli, stąd:

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

Dorje
źródło
Ta odpowiedź bardzo mi pomogła ...
TableLayout
O rany, zaoszczędziłeś mi tyle czasu. Gdzie to jest określone? W dokumentacji nie znalazłem nic, czego nie można wymienićLayoutParams
Adrien Cadet
TableRow.LayoutParamswykonał też tę pracę dla mnie
Menelaos Kotsollaris
6
Kluczową częścią tej odpowiedzi jest 0
Leon,
Skróci mój czas pracy. Szukam tego przez długi czas. Bardzo świetne rozwiązanie
SIVAKUMAR.J
38

We wcześniejszych odpowiedziach waga jest przekazywana do konstruktora nowego obiektu SomeLayoutType.LayoutParams. Nadal w wielu przypadkach wygodniej jest korzystać z istniejących obiektów - pomaga to uniknąć zajmowania się parametrami, którymi nie jesteśmy zainteresowani.

Przykład:

// 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
źródło
loparams może mieć wartość NULL, więc upewnij się, że to sprawdziłeś przed wywołaniem setLayoutParams ()
AAgg
@Agg, nie w praktycznej sytuacji. Widok nie byłby zawyżony, gdyby nie miał ustawionej szerokości i wysokości. Ale zgadzam się - dobrą praktyką jest sprawdzanie, czy istnieją wątpliwości co do wartości zerowej.
sberezin
16
TextView txtview = new TextView(v.getContext());
LayoutParams params = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
txtview.setLayoutParams(params);

1f oznacza jako wagę = 1; możesz podać 2f lub 3f, widoki zostaną przeniesione zgodnie z przestrzenią


źródło
12

po prostu ustaw parametry układu w tym układzie, np

utwórz zmienną param

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

1f jest zmienną wagową

ustaw swój widget lub układ jak

 TextView text = (TextView) findViewById(R.id.text);
 text.setLayoutParams(params);
Manikandan
źródło
skąd ta informacja, że ​​1f oznacza zmienną wagi? Czy możesz podać link?
hayonj
@hayonj po prostu sprawdź źródła LinearLayout.LayoutParamskonstruktora. Trzeci parametr to waga. Lub dokumentacja
mente
11
TextView text = new TextView(v.getContext());
text.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 
                                                LayoutParams.WRAP_CONTENT, 1f));

(LUB)

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

1f określa się jako wagę = 1; w zależności od potrzeb możesz podać 2f lub 3f, widoki zostaną przeniesione zgodnie z przestrzenią. Aby określić określoną odległość między widokami w układzie liniowym, użyj parametru weights dla „LinearLayout”.

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
źródło
8

To powinno ci działać

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

param.weight=1.0f;
Ashok Reddy M.
źródło
7

Możesz również podać wagę osobno w ten sposób,

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

 lp1.weight=1;
Kiran Boghra
źródło
6

To działa dla mnie i mam nadzieję, że zadziała również dla ciebie

Najpierw ustaw LayoutParams dla widoku nadrzędnego:

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

następnie ustaw dla TextView (dziecko):

 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
źródło
1

Jest na to inny sposób. Jeśli musisz ustawić tylko jeden parametr, na przykład „wysokość”:

TextView textView = (TextView)findViewById(R.id.text_view);
ViewGroup.LayoutParams params = textView.getLayoutParams();
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
textView.setLayoutParams(params);
Dmitry
źródło
1

Po 4 godzinach walki. Wreszcie ten kod działał dla mnie.

3 kolumny są w jednym rzędzie.

  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
źródło
-1

Miałem sporo trudności z rozwiązaniem czegoś bardzo podobnego do tego: próbowałem mieć dwa przyciski w TableRow, z których każdy ma połowę szerokości ekranu. Z jakiegokolwiek powodu lewy przycisk zawsze będzie miał około 70% szerokości, a prawy przycisk 30%. Wywołanie table_layout.setStretchAllColumns (true) nie przyniosło żadnego efektu, ani nie ustawiono szerokości przycisku na połowę ekranu, ani nie ustawiono wagi jego układu.

Rozwiązanie skończyło się było zagnieżdżenie się LinearLayout w TableRows, które nie biorą pod uwagę wartość szerokości przyciskom:.

    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
źródło
1
Abyś wiedział na przyszłość, rozwiązaniem jest ustawienie TableRow, Button1 i Button2 na wszystkie layout_width=fill_parent, a po wykonaniu tej czynności ustawić layout_weight=1zarówno dla button1, jak i button2. Wszystkie elementy z fill_parent i layout_weight = 1 otrzymają równy rozmiar po nadmuchaniu.
edtththth