我的问题很简单,
如何设置我的按钮layout_gravity编程?
我在互联网上找到了这个,但它只是抛出了一个空指针异常:
Button MyButton = new Button(this);
LinearLayout.LayoutParams lllp=(LinearLayout.LayoutParams)MyButton.getLayoutParams();
lllp.gravity=Gravity.RIGHT;
MyButton.setLayoutParams(lllp);
MyLinearLayout.addView(MyButton);
有解决方案吗?
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。它可以是RelativeLayout, LinearLayout等等…
我讨厌复活旧线程,但这是一个没有正确回答的问题,而且我自己也遇到过这个问题。
下面是比较长的部分,如果你只对答案感兴趣,请一直向下滚动到代码:
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”,意思是不能通过编程方式访问。
而重力在课堂上是一个场。
如果你想把一个视图放在父母的中心,你可以用下面的代码。
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把第一个视图元素放在父元素的中心。
因此,我们的系统不考虑初始的宽度和高度来安排在中心的视图。
代码部分我做得很好。
其余的答案都是对的,我想补充更多的解释。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。
完美的工作! !以上答案都不适合我。在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的清楚解释。
以上大部分答案都是对的,所以写了一个辅助方法,让你可以使用它
直接在你的项目中。
以编程方式设置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;
}