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


334

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

Как установить мои кнопки 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);

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


Я считаю, что вам нужно добавить представление к его родителю, прежде чем он будет иметь LayoutParams, которые не являются нулевыми.
— Рич Мори

Ответы:


545

Ява

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т.д ...


1
По некоторым причинам params.gravity = 80 (должно быть BOTTOM, te Docs) просто не работает. У меня есть пространство между нижней частью просмотра и текста. Это не так выровнено по
— нижнему

51
Взять постоянное значение из документации просто неправильно, пожалуйста, используйте Gravity.TOP
— Maragues

36
это "гравитация" и он попросил "layout_gravity" ??
— М. Усман Хан

11
@usman нет, это о layout_gravity(то есть LayoutParams.gravity). Было gravityбыbutton.setGravity()
— Флёрн

9
В SO много неправильной информации о гравитации и layout_gravity. Многие люди думают, что setGravity()это layout_gravity, но это неправильно. Я могу подтвердить, что этот ответ является правильным для установки layout_gravity программно.
— Бевор

55

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

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

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

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

По сути, Android: layout_gravity не может быть доступен программно, только Android: гравитация. В случае с ОП и в моем случае принятый ответ не размещает кнопку вертикально по центру.

Чтобы улучшить ответ Karthi:

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

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

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


Также добавить к этому гравитационные авто-поля (из-за отсутствия лучшего термина), основанные на ориентации родителя LinearLayout. Предоставленная ссылка на статью поможет.
— Uknight

21
MyButton.setGravity(Gravity.RIGHT);

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


37
Это просто гравитация, а не layout_gravity.
— Адам Вархеги

Хорошо, тогда скажите мне, если layout_gravity равно setGravity, то как мне установить гравитацию?
— Адам Вархеги


5
Публикация огромного документа не является решением, извините,
— Адам Вархеги,

поищите метод setGravity в ссылке .., как-то не работает перенаправление на точный метод ..
— Yashwanth Kumar

17

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

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

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

Как я могу изменить layout_gravity для всего GridLayout?
— Икбал

15

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

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

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

LinearLayout.LayoutParams

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

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


9

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

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

@Muzikant .. хорошо .. я не заметил первый .. но теперь его ясно me..Thanks
— Noman

Работает ли это только путем указания типа макета? Как RelativeLayout.LayoutParams ... вместо просто LayoutParams
— ryvianstyron

RelativeLayout.LayoutParams используют другие флаги для установки гравитации вида (rightOf, centerInParent, centerVertical). Этот обходной путь предназначен для детей LinearLayouts
— нони,

6

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

Это экономит мое время ... THX
— BertKing

4

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

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

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

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


4

Если вам нужно установить 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;

попробуйте эту надежду это очищает спасибо


3

Остальные ответы верны, я хочу добавить больше объяснений. 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, этот метод не должен возвращать ноль. "


Это тоже немного ... не очевидно, что вам нужно установить гравитацию после вызова addView (). Вы бы подумали, что настроите все в новом представлении, а затем добавите его, так что это не
— интуитивно понятно

3

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

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 поместить первые элементы представления в центр родительского элемента. Таким образом, мы не учитываем начальную ширину и высоту, чтобы упорядочить вид в центре. Я делаю раздел кода хорошо.


я - курсив))))
— Артем

2

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


2

Отлично работает !!! Ни один из приведенных выше ответов не работает для меня. В 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.


1

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

установить 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;
    }

0

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

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

RelativeLayout.LayoutParams mCircleParams = new RelativeLayout.LayoutParams (окружность по высоте, окружность по высоте);

    mCircleParams.addRule(RelativeLayout.CENTER_IN_PARENT);


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

-1
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);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.