Як встановити 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.