Как установить гравитацию макета программно?



мой вопрос прост,



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


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

663   16  

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 центр будет влиять на вид, который является FILL_PARENT (думайте об этом как auto pad).

в основном, android: layout_gravity не может быть доступ программно, только android:гравитация. В случае 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.

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

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

вы должны установить гравитацию * * после метода 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, если это представление не присоединено к a родительская 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.LayoutParams, чтобы, наконец, получить результат, который я хотел на пользовательском circleview, который я создал.

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

RelativeLayout.LayoutParams mCircleParams = new RelativeLayout.LayoutParams(circlehight, circlehight);

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

Comments

    Ничего не найдено.