Как установить layout_gravity программно? - PullRequest
294 голосов
/ 08 ноября 2011

Мой вопрос прост,

Как настроить мои кнопки layout_gravity программно?

Я нашел это в интернете, но он просто выбрасывает исключение Nullpointer:

 Button MyButton = new Button(this);

    LinearLayout.LayoutParams  lllp=(LinearLayout.LayoutParams)MyButton.getLayoutParams();
    lllp.gravity=Gravity.RIGHT;
    MyButton.setLayoutParams(lllp); 


    MyLinearLayout.addView(MyButton);

Есть решение?

Ответы [ 17 ]

498 голосов
/ 08 ноября 2011

Java

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
params.weight = 1.0f;
params.gravity = Gravity.TOP;

button.setLayoutParams(params);

Kotlin

val params = LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.WRAP_CONTENT,
    LinearLayout.LayoutParams.WRAP_CONTENT
).apply {
    weight = 1.0f
    gravity = Gravity.TOP
}

Для значений гравитации и настройки гравитации Гравитация .

По сути, вам следуетвыберите LayoutParams в зависимости от родителя.Это может быть RelativeLayout, LinearLayout и т.д ...

51 голосов
/ 12 ноября 2012

Я бы не хотел воскрешать старые потоки, но это проблема, на которую нет правильного ответа, и, кроме того, я сам столкнулся с этой проблемой.

Вот длинный кусок, если вам интереснов ответе пожалуйста прокрутите до кода:

android: гравитация и android: layout_gravity работает по-разному. Вот статья, которую я прочитал, которая помогла мне.

СУЩНОСТЬ статьи: гравитация влияет на вид после назначения высоты / ширины.Таким образом, центр тяжести не повлияет на вид, который выполняется FILL_PARENT (думайте об этом как об автоматическом поле).Центр layout_gravity БУДЕТ влиять на вид, который является FILL_PARENT (воспринимайте его как auto pad).

В основном, android: layout_gravity НЕ МОЖЕТ быть доступен программно, только android: gravity.В случае с ОП и в моем случае принятый ответ не размещает кнопку вертикально по центру.

Чтобы улучшить ответ Карти:

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.CENTER;
button.setLayoutParams(params);

Ссылка на LinearLayout.LayoutParams.

android: layout_gravity показывает «Нет связанных методов», что означает, что нельзя получить доступ программно.Принимая во внимание, что гравитация - это поле в классе.

22 голосов
/ 08 ноября 2011
MyButton.setGravity(Gravity.RIGHT);

Для layout_gravity используйте ответ, указанный "karthi".Этот метод устанавливает гравитацию для размещения детей внутри вида.

17 голосов
/ 27 июля 2013

У меня была похожая проблема с программной настройкой layout_gravity для кнопок в GridLayout.

Хитрость заключалась в том, чтобы установить гравитацию на кнопке layoutParams ПОСЛЕ кнопка была добавлена ​​к родителю (GridLayout), в противном случае гравитация была бы проигнорирована .

grid.addView(button)
((GridLayout.LayoutParams)button.getLayoutParams()).setGravity(int)
10 голосов
/ 27 апреля 2015

Если вы хотите изменить layou_gravity существующего представления, сделайте следующее:

((FrameLayout.LayoutParams) view.getLayoutParams()).gravity = Gravity.BOTTOM;

Не забудьте использовать право LayoutParams на основе типа макета, в котором находится ваше представление.:

LinearLayout.LayoutParams
9 голосов
/ 16 мая 2017
layoutParams2.gravity = Gravity.RIGHT|Gravity.BOTTOM;

используйте это, чтобы добавить больше чем одна сила тяжести

8 голосов
/ 11 июня 2012

Этот вопрос старый, но у меня была такая же проблема, и я решил ее следующим образом

LayoutParams lay = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)
lay.gravity = Gravity.CENTER;
4 голосов
/ 29 января 2019

KOTLIN устанавливает более одной силы тяжести в FrameLayout без изменения размера:

     // assign more than one gravity,Using the operator "or"
    var gravity = Gravity.RIGHT or Gravity.CENTER_VERTICAL
     // update gravity
    (pagerContainer.layoutParams as FrameLayout.LayoutParams).gravity = gravity
     // refresh layout
     pagerContainer.requestLayout()
4 голосов
/ 05 сентября 2014

Я использую что-то вроде этого: (код Xamarin и C #)

  LinearLayout linLayout= new LinearLayout(this); 
    linLayout.SetGravity(GravityFlags.Center);

    TextView txtView= new TextView(this);  
     linLayout.AddView(txtView); 

SetGravity помещает мой textView в центр макета. Так что SetGravity свойство layout относится к макету content

3 голосов
/ 24 июля 2015

Остальные ответы верны, я хочу добавить больше объяснений. Layout_gravity - о том, как расположить представление в родительском представлении.

Вы должны установить гравитацию ** после вызова метода parentView.addView () **. Мы можем увидеть код:

public void setLayoutParams(ViewGroup.LayoutParams params) {
    if (params == null) {
        throw new NullPointerException("Layout parameters cannot be null");
    }
    mLayoutParams = params;
    resolveLayoutParams();
    if (mParent instanceof ViewGroup) {
        ((ViewGroup) mParent).onSetLayoutParams(this, params);
    }
    requestLayout();
}

И проблема нулевого указателя в том, что он не вызывает addView до getLayoutParams ().

В аннотации уже было сказано: «Этот метод может возвращать ноль, если это представление не прикреплено к родительской ViewGroup или {@ link # setLayoutParams (android.view.ViewGroup.LayoutParams)} не был успешно вызван. родительскому ViewGroup этот метод не должен возвращать ноль. "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...