Как установить 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т.д ...

Karthi
источник
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 показывает «Нет связанных методов», что означает, что нельзя получить доступ программно. В то время как гравитация - это поле в классе.

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

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

Яшвант Кумар
источник
37
Это просто гравитация, а не layout_gravity.
Адам Вархеги
Хорошо, тогда скажите мне, если layout_gravity равно setGravity, то как мне установить гравитацию?
Адам Вархеги
developer.android.com/reference/android/widget/… , посмотрите на это ..
Яшвант Кумар
5
Публикация огромного документа не является решением, извините,
Адам Вархеги,
поищите метод setGravity в ссылке .., как-то не работает перенаправление на точный метод ..
Yashwanth Kumar
17

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

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

grid.addView(button)
((GridLayout.LayoutParams)button.getLayoutParams()).setGravity(int)
owjsub
источник
Как я могу изменить layout_gravity для всего GridLayout?
Икбал
15

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

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

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

LinearLayout.LayoutParams
vovahost
источник
12
layoutParams2.gravity = Gravity.RIGHT|Gravity.BOTTOM;

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

Омар Алнаджар
источник
9

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

LayoutParams lay = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)
lay.gravity = Gravity.CENTER;
CodeFlakes
источник
@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 относится к содержимому макета

alin0509
источник
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;

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

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

Cheng
источник
я - курсив))))
Артем
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);
user3886197
источник
0

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

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

или

    btn.setGravity(Gravity.TOP);
Факсриддин Абдуллаев
источник
3
ОП просит layout_gravityне gravitiy.
Али Зейнали
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);
ВИВЕК ХУДОХАРЫ
источник