Як динамічно встановити атрибут layout_weight з коду?


245

Як я можу layout_weightдинамічно встановити значення атрибута кнопки в android динамічно з коду Java?


Це буде дуже схоже на це питання / відповідь: stackoverflow.com/questions/4638832/… і цей: stackoverflow.com/questions/4637233/…
Rich Schuler

Якщо ви вже визначили перегляд у файлі макета (xml), то при створенні нового LayoutParams перезаписуються інші параметри, визначені у файлі xml. Тому спочатку слід скористатися "getLayoutParams". Дивіться повну відповідь stackoverflow.com/questions/4641072 / ...
Shirish Herwade

Відповіді:


463

Ви можете передати його як частину LinearLayout.LayoutParamsконструктора:

LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
    LayoutParams.MATCH_PARENT,
    LayoutParams.MATCH_PARENT,
    1.0f
);
YOUR_VIEW.setLayoutParams(param);

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


2
Має бутиparam = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, (float) 1.0);
Мітхун Средхаран

49
Якщо ви не хочете
переходити

8
Або ще простіше, 1fякщо немає десяткових знаків
Sandalone

4
що робити, якщо батьківський макетRelative
Пратік Бутані

9
@pratik, якщо батьківський макет є відносним, ви не використовуєте ваги
invertigo

121

Використання LinearLayout.LayoutParams:

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
    LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
params.weight = 1.0f;
Button button = new Button(this);
button.setLayoutParams(params);

EDIT: Ах, відповідь Еріха простіше!


27
Енріх-ансер може бути простішим, але ваш легше читати. Оскільки він говорить, для якого атрибута використовується 1.0f.
Йоган

3
Ви встановили, що Ви можете змінювати вагу на льоту, зателефонувавши "view.getLayoutParams ()", а потім змінити значення.
RobGThai

1
FILL_PARENTзастаріло і його MATCH_PARENTслід використовувати замість цього.
Саймон Форсберг

2
@LocalPCGuy Неправда. Поки ви орієнтовані на SDK> = 8 (яким ви абсолютно повинні бути), MATCH_PARENTйого можна використовувати замість FILL_PARENTнавіть на старих пристроях.
Кевін Коппок

2
@LocalPCGuy Більше ніхто не використовує API 7 або менше . Якщо ви намагаєтеся зробити ваше додаток сумісно з API , 7-менш, ви, ймовірно , зіткнетеся з цілим безліччю інших проблем , перш ніж турбуватися про FILL_PARENTVS. MATCH_PARENT.
Саймон Форсберг

82

Якщо ви вже визначили свій погляд у файлі макета (xml), бажаєте лише змінити вагу програмно, таким чином краще

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)   
mButton.getLayoutParams();
params.weight = 1.0f;
mButton.setLayoutParams(params);

новий LayoutParams замінює інші параметри, визначені у вашому XML-файлі, як поля, або вам потрібно вказати їх у LayoutParams.


2
З "params.weight = 1f;" ви вже встановлюєте вагу об’єкта LayoutParams. Не потрібно викликати "mButton.setLayoutParams (params);".
MrMaffen

2
Ні, вам потрібно зателефонувати на setLayoutParams
SIr Codealot

1
Це насправді найелегантніша відповідь, і вона безпосередньо змінює конкретний об’єкт інтерфейсу. Найкраща відповідь - це теж добре і старше цієї посади. Тож це заслуговує як найкращої відповіді. Я хоч і підтримав цю посаду.
Оригінальний Android

Чудове і просте рішення!
Джеремі

Працює як шарм! Велике спасибі :)
Vinay Vissh

26

Якщо конструктор із шириною, висотою та вагою не працює, спробуйте скористатися конструктором із шириною та висотою. А потім вручну встановити вагу.

І якщо ви хочете, щоб ширина була встановлена ​​відповідно до ваги, встановіть ширину як 0 у конструкторі. Те саме стосується висоти. Нижче код працює для мене.

LinearLayout.LayoutParams childParam1 = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT);
childParam1.weight = 0.3f;
child1.setLayoutParams(childParam1);

LinearLayout.LayoutParams childParam2 = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT);
childParam2.weight = 0.7f;
child2.setLayoutParams(childParam2);

parent.setWeightSum(1f);
parent.addView(child1);
parent.addView(child2);

Тільки те, що мені було потрібно! Усі тут говорять про встановлення ваги, ніхто не показує, що відбувається, коли ці зважені діти додаються до виду батьків! Я насправді шукав, як додати weightSum на ParentView! Дякую!
sud007

14

Якщо я хтось шукає відповіді, використовуйте це:

LinearLayout.LayoutParams lay = (LinearLayout.LayoutParams) myLayout.getLayoutParams();
lay.weight = 0.5;

Якщо ви ініціалізуєте ваш макет з файлу xml, це буде набагато зручніше, ніж надання нових параметрів компонування для лінійної макети.


Це має бути прийнятою відповіддю, оскільки вона не змінює жодних раніше встановлених змінних, таких як ширина / висота / запас / підкладка тощо. Все зберігається та використовується повторно, коли вага змінюється.
MrMaffen

1
Якщо представлення для встановлення layout_weightвже викладено, вам потрібно зателефонувати, View.requestLayout()щоб оновити.
Атакувальний

6

Будь-яка LinearLayout.LayoutParamsі TableLayout.LayoutParamsпрацювала для мене, для кнопок потрібна TableRow.LayoutParams. Це є:

            TableRow.LayoutParams buttonParams = new TableRow.LayoutParams(
                    TableRow.LayoutParams.MATCH_PARENT,
                    TableRow.LayoutParams.WRAP_CONTENT, 1f);

Про використання MATCH_PARENTабо WRAP_CONTENTбути однаковим.


3
FILL_PARENTзастаріло і його MATCH_PARENTслід використовувати замість цього.
Simon Forsberg

Я думаю, що LayoutParams.MATCH_PARENT слід змінити на 0.
CoolMind

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

4

Якщо ви вже визначили свій перегляд у файлі макета (xml) і хочете лише змінити вагу граматично, тоді, створюючи нові LayoutParams, буде замінено інші параметри, визначені у вашому xml-файлі.

Отже, спочатку слід скористатися "getLayoutParams", а потім встановитиLayoutParams

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mButton.getLayoutParams(); params.weight = 4f; mButton.setLayoutParams(params);


3

Якщо layoutparamsце вже визначено (у XML або динамічно), ось один вкладиш:

((LinearLayout.LayoutParams) mView.getLayoutParams()).weight = 1;

Занижена відповідь
Адам Хіггінс

0

Використовуючи Kotlin, ви можете зробити щось на кшталт:

import android.content.Context
import android.support.v4.content.ContextCompat
import android.support.v7.widget.CardView
import android.widget.*

import android.widget.LinearLayout

class RespondTo : CardView {
    constructor(context: Context) : super(context) {
        init(context)
    }

    private fun init(context: Context) {


        val parent = LinearLayout(context)

        parent.apply {
            layoutParams = LinearLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
                    FrameLayout.LayoutParams.WRAP_CONTENT, 1.0f).apply {
                orientation = LinearLayout.HORIZONTAL

                addView(EditText(context).apply {
                    id = generateViewId()
                    layoutParams = LinearLayout.LayoutParams(0,
                            LinearLayout.LayoutParams.WRAP_CONTENT, 0.9f).apply {
                    }
                })
                addView(ImageButton(context).apply({
                    layoutParams = LinearLayout.LayoutParams(0,
                            LinearLayout.LayoutParams.WRAP_CONTENT, 0.1f)
                    background = null
                    setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_save_black_24px))
                    id = generateViewId()
                    layoutParams = RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                            LinearLayout.LayoutParams.WRAP_CONTENT).apply {
                        addRule(RelativeLayout.ALIGN_PARENT_RIGHT)
                        // addRule(RelativeLayout.LEFT_OF, myImageButton.id)
                    }
                }))
            }
        }
        this.addView(parent)
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.