Як встановити 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, які не є нульовими.
Rich Morey

Відповіді:


545

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


1
З деяких причин params.gravity = 80 (Це повинно бути BOTTOM, від Te Docs) просто не працює. У мене з’явилося місце між нижньою частиною Перегляду і Тексту. Це не так, що вирівнюється знизу ...
Адам Варгегій

51
Отримувати постійне значення з документації просто неправильно, будь ласка, використовуйте Gravity.TOP
Maragues

35
це "гравітація", і він попросив "layout_gravity" ??
М. Усман Хан

10
@usman ні, це про layout_gravity(це LayoutParams.gravity). Було gravityбbutton.setGravity()
Флоерн

8
Тут багато інформації про гравітацію та макет_гравітації. Багато ppl вважають, що setGravity()це layout_gravity, але це неправильно. Я можу підтвердити, що ця відповідь є правильною для встановлення layout_gravity програмно.
Бевор

55

Мені б не хотілося відроджувати старі теми, але це проблема, на яку не відповідають правильно, і більше того, я сам наткнувся на цю проблему.

Ось довгий біт, якщо вас цікавить лише відповідь, будь ласка, прокрутіть увесь шлях до коду:

android: гравітація та android: layout_gravita працює по-різному. Ось я прочитав статтю, яка мені допомогла.

ГІСТ статті: гравітація впливає на вигляд після призначення висоти / ширини. Тож центр тяжкості не вплине на вигляд, який робиться FILL_PARENT (подумайте про це як автоматичний запас). Центр layout_gravity вплине на перегляд, який є FILL_PARENT (подумайте про це, як про автоматичну панель).

В основному, андроїд: layout_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 показує "Без пов'язаних методів", тобто сенс не може бути доступний програмно. Тоді як гравітація - це поле у ​​класі.


Крім того, щоб додати до цієї гравітації автоматичні запаси (за відсутності кращого терміну) на основі орієнтації батьків на LinearLayout. Надане посилання на статтю допоможе.
Unightnight

21
MyButton.setGravity(Gravity.RIGHT);

Для layout_gravity скористайтеся відповіддю, вказаною "karthi". Цей метод встановлює тяжкість, щоб розмістити дітей всередині зору.


37
Це лише гравітація, а не макет_гравітація.
Адам Вархегiй

Добре, тоді скажіть мені, якщо layout_gravity дорівнює setGravity, то як я встановити гравітацію?
Адам Вархегiй


5
Опублікувати величезний Документ - це не шкода,
Адам Варгегій

шукайте метод setGravity за посиланням .., якимось чином перенаправлення на точний метод не працює ..
Yashwanth Kumar

17

У мене була подібна проблема із програмним налаштуванням layout_gravity на кнопки в GridLayout.

Хитрість полягала в тому, щоб встановити гравітацію на макеті кнопкиПАРАМИ ПІСЛЯ кнопки була додана батьківському (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


9

Це питання давнє, але я просто мав ту саму проблему і вирішив її так

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

@Muzikant .. ок .. я не помітив спочатку .., але тепер мені це зрозуміло .. Дякую
Номан

Чи працює це лише шляхом вказівки, який тип макета це спочатку? Як 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 for View, скористайтеся наступним

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

Для встановлення layout_gravity для кнопки використовуйте поле гравітації для макетпарам як

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 (). Ви б подумали, що все налаштуєте на новий вигляд, а потім додасте його, щоб це було не інтуїтивно :-P
kenyee

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

Також поставте прапорець у цьому, де ви зможете знайти чітке пояснення щодо сили тяжіння та гравітації.


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 = новий 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.