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

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

Как настроить программные кнопки 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);

Любое решение?

Ответ 1

Java

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

button.setLayoutParams(params);

Котлин

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

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

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

Ответ 2

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

Здесь длинный бит, если вас интересует только ответ, прокрутите весь путь до кода:

android: гравитация и андроид: layout_gravity работает по-разному. Здесь прочитанная мной статья помогла мне.

GIST статьи: гравитация влияет на представление после назначения высоты/ширины. Таким образом, центр тяжести не повлияет на представление, которое сделано FILL_PARENT (подумайте об этом как автомаршрут). layout_gravity center WILL влияет на представление, которое является FILL_PARENT (думайте об этом как автоматическую панель).

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

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

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

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

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

Ответ 3

MyButton.setGravity(Gravity.RIGHT);

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

Ответ 4

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

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

grid.addView(button)
((GridLayout.LayoutParams)button.getLayoutParams()).setGravity(int)

Ответ 5

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

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

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

LinearLayout.LayoutParams

Ответ 6

layoutParams2.gravity = Gravity.RIGHT|Gravity.BOTTOM;

используйте это, чтобы добавить более чем одну гравитацию

Ответ 7

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

LayoutParams lay = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)
lay.gravity = Gravity.CENTER;

Ответ 8

Я использую следующее: (Xamarin и С# code)

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

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

SetGravity помещает мой textView в центр макета. Таким образом, свойство SetGravity макета ссылается на макет контент

Ответ 9

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

Ответ 10

Если вы хотите поместить представление в центр родителя, вы можете сделать следующий код.

public class myLayout extends LinearLayout {

    public myLayout(Context context) {
      super(context);

      RelativeLayout vi = (RelativeLayout) ((LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
            R.layout.activity_main, null);
      LinearLayout.LayoutParams cc = new LinearLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
      cc.gravity = Gravity.CENTER;
      this.setGravity(Gravity.CENTER);
      this.addView(vi);
  }
}

этот раздел кода делает LinearLayout помещать первые элементы представления в центр родителя. Таким образом, мы не рассматриваем начальную ширину и высоту, чтобы организовать представление в центре. Я хорошо разбираюсь в коде.

Ответ 11

Если вам нужно установить Gravity для просмотра, используйте следующий

Button b=new Button(Context);
b.setGravity(Gravity.CENTER);

Для установки layout_gravity для кнопки используйте гравитационное поле для layoutparams как

LayoutParams lp=new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
lp.gravity=Gravity.CENTER;

попробуйте это надеюсь, что это очистит спасибо

Ответ 12

Остальные ответы правильные, я хочу добавить больше объяснений. 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().

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

Ответ 13

RelativeLayout, попробуйте этот код, он работает для меня: yourLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);

Ответ 14

Отлично работает!!! Ни один из вышеперечисленных ответов не работает для меня. В настройках файла Xml гравитация и настройка layout_gravity различны. Ознакомьтесь с приведенным ниже кодом.

// here messageLL is the linear layout in the xml file
// Before adding any view just remove all views
   messageLL.removeAllViews();
// FrameLayout is the parent for LinearLayout
FrameLayout.LayoutParams params = new 
   FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
   params.gravity = Gravity.CENTER|Gravity.CENTER_VERTICAL;
   messageLL.setLayoutParams(params);
   messageText.setVisibility(View.GONE);
   messageNoText.setVisibility(View.VISIBLE);
   messageLL.addView(messageNoText);

Также проверьте Это, где вы можете найти четкое объяснение гравитации и layout_gravity.

Ответ 15

Я переключился с LinearLayout.LayoutParams на RelativeLayout.LayoutParams, чтобы, наконец, получить результат, который я хотел получить в пользовательском круге, который я создал.

Вместо гравитации вы используете addRule

RelativeLayout.LayoutParams mCircleParams = new RelativeLayout.LayoutParams(круговое окружение, круговое движение);

    mCircleParams.addRule(RelativeLayout.CENTER_IN_PARENT);

Ответ 16

Попробуйте этот код

    Button btn = new Button(YourActivity.this);
    btn.setGravity(Gravity.CENTER | Gravity.TOP);
    btn.setText("some text");

или

    btn.setGravity(Gravity.TOP);

Ответ 17

 int width=getResources().getDisplayMetrics().widthPixels; 
 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams
                    (width, width);

            params.gravity = Gravity.CENTER;

           iv_main_text = new HTextView(getContext());
            iv_main_text.setLayoutParams(params);
            iv_main_text.setBackgroundColor(Color.BLUE);
            iv_main_text.setTextSize(60);
            iv_main_text.setGravity(Gravity.CENTER);
            iv_main_text.setTextColor(Color.BLACK);

Ответ 18

Большинство из приведенных выше ответов верны, поэтому написали вспомогательные методы,, чтобы вы могли их использовать прямо в вашем проекте.

установить layout_gravity программно

// gravity types : Gravity.BOTTOM, Gravity.START etc.
// view : can be any view example : button, textview, linearlayout, image etc.

// for single view
   public static void setLayoutGravity(int gravity, View view){
     ((LinearLayout.LayoutParams) view.getLayoutParams()).gravity = gravity;
    }


// for mulitple views
  public static void setLayoutGravity(int gravity, View ...view){
        for(View item : view)
            ((LinearLayout.LayoutParams) item.getLayoutParams()).gravity = gravity;
    }

Ответ 19

FloatingActionButton sendFab = new FloatingActionButton(this);
    FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    layoutParams.setMargins(32, 32, 32, 32);
    layoutParams.gravity = Gravity.END|Gravity.BOTTOM;
    sendFab.setLayoutParams(layoutParams);
    sendFab.setImageResource(android.R.drawable.ic_menu_send);