Как установить гравитацию макета программно?
мой вопрос прост,
Как установить мои кнопки 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 центр будет влиять на вид, который является 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