如何以编程方式设置layout_gravity ?

我的问题很简单,

如何设置我的按钮layout_gravity编程?

我在互联网上找到了这个,但它只是抛出了一个空指针异常:

 Button MyButton = new Button(this);


LinearLayout.LayoutParams  lllp=(LinearLayout.LayoutParams)MyButton.getLayoutParams();
lllp.gravity=Gravity.RIGHT;
MyButton.setLayoutParams(lllp);




MyLinearLayout.addView(MyButton);

有解决方案吗?

336339 次浏览
MyButton.setGravity(Gravity.RIGHT);

对于layout_gravity使用“karthi”给出的答案。这个方法设置重力以将子视图放置在视图中。

Java

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


button.setLayoutParams(params);

芬兰湾的科特林

val params = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT
).apply {
weight = 1.0f
gravity = Gravity.TOP
}

对于重力值和如何设置重力检查重力

基本上,你应该根据父类来选择LayoutParams。它可以是RelativeLayoutLinearLayout等等…

这个问题很老了,但我遇到过同样的问题,并像这样解决了它

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

我讨厌复活旧线程,但这是一个没有正确回答的问题,而且我自己也遇到过这个问题。

下面是比较长的部分,如果你只对答案感兴趣,请一直向下滚动到代码:

Android:gravity和Android:layout_gravity工作方式不同。在这里是我读过的一篇帮助我的文章。

文章要点:重力在高度/宽度分配后影响视图。因此重心不会影响FILL_PARENT(认为它是自动边距)完成的视图。layout_gravity centre将影响视图FILL_PARENT(认为它是auto pad)。

基本上,android:layout_gravity不能通过编程方式访问,只有android:gravity。 在OP的情况和我的情况下,接受的答案没有将按钮垂直置于中心

为了完善Karthi的回答:

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

链接LinearLayout.LayoutParams

android:layout_gravity显示“No related methods”,意思是不能通过编程访问。 而重力是类中的场

我有一个类似的问题,以编程方式设置layout_gravity按钮在GridLayout。

诀窍是在按钮layoutParams 上设置重力,该按钮被添加到父(GridLayout), 否则重力就会被忽略

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

如果你想把一个视图放在父母的中心,你可以用下面的代码。

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把第一个视图元素放在父元素的中心。 因此,我们的系统不考虑初始的宽度和高度来安排在中心的视图。 我做的代码部分很好。

我使用类似这样的东西:(Xamarin和c#代码)

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


TextView txtView= new TextView(this);
linLayout.AddView(txtView);
SetGravity把我的textView放在布局的中心。 因此SetGravity布局属性引用布局内容

如果你需要为视图设置重力,请使用以下方法

Button b=new Button(Context);
b.setGravity(Gravity.CENTER);

用于设置按钮的layout_gravity 使用重力场的布局参数为

LayoutParams lp=new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
lp.gravity=Gravity.CENTER;
< p >试试这个 希望天气晴朗 由于< / p >
如果你想改变现有视图的layou_gravity,可以这样做:

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

记住要根据视图所在的布局类型使用正确的LayoutParams。例:

LinearLayout.LayoutParams

我从LinearLayout切换过来。LayoutParams to RelativeLayout。LayoutParams来最终得到我在创建的自定义圆环视图上想要的结果。

但是你用的不是gravity而是addRule

RelativeLayout。mCircleParams = new RelativeLayout.LayoutParams(circleheight,circleheight);

    mCircleParams.addRule(RelativeLayout.CENTER_IN_PARENT);

其余的答案都是对的,我想补充更多的解释。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();
}

空指针的问题是因为它在getLayoutParams()之前没有调用addView。

注释已经说过“如果这个视图没有附加到父视图组,或者{@link#setLayoutParams(android.view.ViewGroup.LayoutParams)}没有成功调用,这个方法可能会返回null。”当一个View附加到父ViewGroup时,这个方法不能返回null。

到RelativeLayout,试试这段代码,它为我工作: yourLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); < / p >

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

用它来增加一个以上的重力

试试这段代码

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

    btn.setGravity(Gravity.TOP);

上面的答案都不适合我。在Xml文件中设置gravity和设置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的清楚解释。< / >

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

KOTLIN在FrameLayout上设置多个重力而不改变大小:

     // assign more than one gravity,Using the operator "or"
var gravity = Gravity.RIGHT or Gravity.CENTER_VERTICAL
// update gravity
(pagerContainer.layoutParams as FrameLayout.LayoutParams).gravity = gravity
// refresh layout
pagerContainer.requestLayout()
FloatingActionButton sendFab = new FloatingActionButton(this);
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(32, 32, 32, 32);
layoutParams.gravity = Gravity.END|Gravity.BOTTOM;
sendFab.setLayoutParams(layoutParams);
sendFab.setImageResource(android.R.drawable.ic_menu_send);
上面大部分答案都是正确的,所以写了一个辅助方法,,这样你就可以使用它

以编程方式设置layout_gravity

// gravity types : Gravity.BOTTOM, Gravity.START etc.
// view : can be any view example : button, textview, linearlayout, image etc.


// for single view
public static void setLayoutGravity(int gravity, View view){
((LinearLayout.LayoutParams) view.getLayoutParams()).gravity = gravity;
}




// for mulitple views
public static void setLayoutGravity(int gravity, View ...view){
for(View item : view)
((LinearLayout.LayoutParams) item.getLayoutParams()).gravity = gravity;
}

修改现有的布局参数并重新设置布局参数

//Get the current layout params and update the Gravity
(iv.layoutParams as FrameLayout.LayoutParams).gravity = Gravity.START
//Set layout params again (this updates the view)
iv.layoutParams = layoutParams