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

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

16 ответов


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

button.setLayoutParams(params);

для значений силы тяжести и как установить проверку силы тяжести гравитация.

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


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

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

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

суть статьи: сила тяжести влияет на вид после высоты / ширины назначенный. Таким образом, центр тяжести не повлияет на представление, которое выполняется FILL_PARENT (думайте об этом как об автоматическом поле). layout_gravity centre повлияет на представление, которое является FILL_PARENT (подумайте об этом как auto pad).

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

улучшить, включают в ответ:

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

ссылке to LinearLayout.LayoutParams.

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


MyButton.setGravity(Gravity.RIGHT);

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


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

хитрость заключалась в том, чтобы установить гравитацию на кнопку layoutParams после кнопка была добавлена к родителю (GridLayout), в противном случае гравитация будет игнорироваться.

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

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

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

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

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


если вы хотите изменить layou_gravity существующий вид этого:

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

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

LinearLayout.LayoutParams

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

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

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

SetGravity помещает мой textView в центр макета. Так что SetGravity свойство layout обратитесь к layout контент


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

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-это способ позиционирования представления в Родительском представлении.

вы должны установить 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.вид.ViewGroup.Ни)} не был успешно вызван. Если представление присоединено к родительской группе представлений, этот метод не должен возвращать значение null."


чтобы 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 .


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

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


я переключился с LinearLayout.LayoutParams к RelativeLayout.Ни, наконец, получить тот результат, которого я желал на заказ circleview я создал.

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

RelativeLayout.LayoutParams mCircleParams = новый RelativeLayout.LayoutParams (circleheight,circleheight);

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

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