Встановіть вагу макета TextView програмно


214

Я намагаюся динамічно створювати TableRowоб’єкти та додавати їх до а TableLayout. В TableRowоб'єктах є 2 елементів, то TextViewі CheckBox. В TextViewелементи повинні мати свій макет набір ваги 1 , щоб розсунути CheckBoxелементи в крайнє праве положення .

Я не можу знайти документацію про те, як програмно встановити вагу макета TextViewелемента.

Відповіді:


355

Ви повинні використовувати TableLayout.LayoutParamsщось подібне:

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

Останній параметр - вага.


15
Я раніше про це не згадував, тому мені шкода. Але я спробував це до того, як задати своє запитання. Це змушує TextView зникати з макета. Але, на позитивній ноті, я виявив, що встановлення властивості stretch_column у TableLayout до 0 викликає шуканий ефект (TextView зліва, CheckBoxes праворуч). Дякую за допомогу.
Євген

8
Якщо ви імпортуєте макет XML і не створюєте макет динамічно, ви можете схопити його так:TextView tv = (TextView) findViewById(R.id.your_textview_inside_the_linearlayout); tv.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 0.1f));
Ерік Лещинський

5
Щоб встановити вагу макета програмно, TableRow.LayoutParamsслід використовувати замість TableLayout.LayoutParams. Дивіться відповідь @ Дордже.
Халіл

імпортувати android.widget.LinearLayout; імпортувати android.widget.TableLayout;
Пракаш

1
Зауважте, що більшість людей використовуватиме 0 як перший чи другий параметр (залежно від того, горизонтальний чи вертикальний), а не WRAP_CONTENT, оскільки те, що вони шукають, - це встановити вагу.
FlorianB

97

Відповідь полягає в тому, що вам потрібно використовувати TableRow.LayoutParams, а не LinearLayout.LayoutParams або будь-який інший LayoutParams.

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

Різні параметри макета не є взаємозамінними, і якщо ви використовуєте неправильний, то, схоже, нічого не відбудеться. Батьком подання тексту є рядок таблиці, отже:

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


Ця відповідь мені дуже допомогла ... TableLayout не працював на мене
sham.y

Боже, ти врятував мені стільки часу. Де це вказано? Я не знайшов нічого в документації про те, що не можеш обмінятисяLayoutParams
Адрієн Кадет

TableRow.LayoutParamsзробив цю роботу і для мене
Менелаос Котсоларіс

6
Ключова частина цієї відповіді - 0
Леон

Це скоротить мій робочий час. Я довго шукаю це. Дуже чудове рішення
SIVAKUMAR.J

38

У попередніх відповідях вага передається конструктору нового об’єкта SomeLayoutType.LayoutParams. Однак у багатьох випадках зручніше використовувати існуючі об'єкти - це допомагає уникнути роботи з параметрами, які нас не цікавлять.

Приклад:

// 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);

loparams може бути NULL, тому переконайтеся, що перед тим, як викликати setLayoutParams ()
AAgg

@AAgg, не в практичній ситуації. Вид не надувався б, якби не встановлені ширина та висота. Але я погоджуюся - це хороша практика перевірити, коли є сумніви щодо нуля.
sberezin

16
TextView txtview = new TextView(v.getContext());
LayoutParams params = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
txtview.setLayoutParams(params);

1f позначається як вага = 1; Ви можете надати 2f або 3f, перегляди переміщуватимуться кодування до простору


12

просто встановіть параметри компонування в такому макеті, як

створити змінну парам

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

1f - змінна вага

встановіть свій віджет або макет як

 TextView text = (TextView) findViewById(R.id.text);
 text.setLayoutParams(params);

звідки ви отримуєте цю інформацію, що 1f означає змінну вагу? Чи можете ви надати посилання, будь ласка?
hayonj

@hayonj просто перевірити джерела LinearLayout.LayoutParamsконструктора. 3-й параметр - вага. Або документація
менте

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

(АБО)

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

1f позначається як вага = 1; відповідно до ваших потреб ви можете надати 2f або 3f, перегляди переміщуватимуться в кодовому просторі. Для створення вказаної відстані між переглядами в лінійному макеті використовуйте вагу для "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);

8

Це має працювати для вас

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

param.weight=1.0f;

7

Ви також можете давати вагу окремо, як це,

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

 lp1.weight=1;

6

Ця робота для мене, і я сподіваюся, вона буде працювати і для вас

Спершу встановіть параметри макета для батьківського перегляду:

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

потім встановіть для TextView (дочірнє):

 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); 

1

Є ще один спосіб зробити це. Якщо вам потрібно встановити лише один параметр, наприклад, висота:

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

1

Після боротьби протягом 4 годин. Нарешті, цей код працював для мене.

3 стовпчики є там підряд.

  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));

-1

У мене було досить складно з рішенням, подібним до цього: намагання мати дві кнопки в TableRow, кожна з яких - половина ширини екрана. З будь-якої причини ліва кнопка завжди становитиме близько 70% ширини, а права кнопка - 30%. Виклик table_layout.setStretchAllColumns (true) не мав ефекту, а також не встановлював ширину кнопки на половину екрана, а також не встановлював їх макет розташування.

Рішення , яке я закінчив з була вкладеності в LinearLayout в TableRows, що було брати до уваги значення ширини кнопки.

    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;
        }

1
Тільки щоб ви знали на майбутнє, рішення полягає в тому, щоб встановити TableRow, Button1 і Button2 для всіх layout_width=fill_parent, і, зробивши це, встановіть layout_weight=1і кнопки1, і button2. Всім елементам, що мають fill_parent та layout_weight = 1, буде надано однаковий розмір після інфляції.
другий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.