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