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

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

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

Для значений силы тяжести и как установить проверку силы тяжести Gravity

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

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

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

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

 MyButton.setGravity(Gravity.RIGHT); 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 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; 

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

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

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

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

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

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

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

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

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

  mCircleParams.addRule(RelativeLayout.CENTER_IN_PARENT); 

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

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

или

  btn.setGravity(Gravity.TOP); 
Intereting Posts
Каков правильный способ совместного использования данных между AppWidgetProvider и RemoteViewsService.RemoteViewsFactory Не удалось создать приложение com.android.tools.fd.runtime.BootstrapApplication? SearchView при проблемах с библиотекой support.v7.appcompat: по умолчанию 9-патч-фон не отображается правильно Как получить информацию об использовании аккумулятора Android по заявке Xml-ошибка в Eclipse после обновления Android SDK Tools Не удается найти ошибки символов в учебнике Android Studio? Карты Google на вкладке actionbarsherlock Замените стандартный парсер Android JSON для лучшей производительности? Использование функции strftime sqlite в android Гарантирован ли сервис android для вызова onDestroy ()? Android ViewPager обнаруживает вертикальные прокрутки В Bolts, как вы используете continueWith () и continueWithTask ()? Android: Можно запустить несколько экземпляров Activity в одной и той же задаче? ProGuard: Предупреждение: butterknife.internal.InjectViewProcessor: NullPointerException в ItemizedOverlay.getIndexToDraw