我已将TextView以编程方式添加到LinearLayout中,并且在某些外部事件上我想将TextView的下边距减少到-10,为此我尝试了以下操作。
LinearLayout.LayoutParams lastTxtParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lastTxtParams.setMargins(0, 0, 0, -10);
mOldTextView.setLayoutParams(lastTxtParams);
mOldTextView.invalidate();
修改已添加到View的窗口小部件的边距是否正确?
一些如何不起作用。
答案 0 :(得分:183)
TextView forgot_pswrd = (TextView) findViewById(R.id.ForgotPasswordText);
forgot_pswrd.setOnTouchListener(this);
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
llp.setMargins(50, 0, 0, 0); // llp.setMargins(left, top, right, bottom);
forgot_pswrd.setLayoutParams(llp);
我这样做了,效果很好。 也许当你在-ve中给出价值时,这就是你的代码无效的原因。 您只需将此代码放在创建视图引用的位置。
答案 1 :(得分:60)
您在xml中的布局可能已经包含了layout_margin(Left | Right | etc)属性,这意味着您需要访问该xml生成的对象并进行修改。
我发现这个解决方案非常简单:
ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) mTextView
.getLayoutParams();
mlp.setMargins(adjustmentPxs, 0, 0, 0);
break;
获取textview的LayoutParams实例,将其向下转换为MarginLayoutParams,并使用setMargins方法设置边距。
答案 2 :(得分:10)
这是一个棘手的问题,我在表格布局的一行中设置了textview到textview。 见下文:
TableLayout tl = new TableLayout(this);
tl.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
TableRow tr = new TableRow(this);
tr.setBackgroundResource(R.color.rowColor);
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.setMargins(4, 4, 4, 4);
TextView tv = new TextView(this);
tv.setBackgroundResource(R.color.textviewColor);
tv.setText("hello");
tr.addView(tv, params);
TextView tv2 = new TextView(this);
tv2.setBackgroundResource(R.color.textviewColor);
tv2.setText("hi");
tr.addView(tv2, params);
tl.addView(tr);
setContentView(tl);
导入LayoutParams以在表格行中使用的类是:
import android.widget.**TableRow**.LayoutParams;
重要的是要注意我添加了表行的类。类似地,许多其他类可用于使用LayoutParams,如:
import android.widget.**RelativeLayout**.LayoutParams;
import android.widget。 LinearLayout .LayoutParams;
因此使用。
答案 3 :(得分:5)
setMargins()设置TextView的INNER边距,而不是布局边距。那是你想做的吗?这两个不同的边距可能非常复杂。
如果要设置布局边距,请更改TextView的LayoutParams(textview.getLayoutParams(),然后更改返回的LayoutParams对象上的参数)。
您无需在LinearLayout上更改任何内容。
此致 奥利弗
答案 4 :(得分:2)
TextView不支持setMargins。 Android docs说:
即使视图可以定义填充,它也不会为边距提供任何支持。但是,视图组提供了这样的支持。有关详细信息,请参阅ViewGroup和ViewGroup.MarginLayoutParams。
答案 5 :(得分:1)
这是另一种方法......
当我遇到同样的问题时,我不喜欢这里建议的解决方案。 所以,我想出了另一种方式: 我在XML文件中插入了一个TextView,我希望将这两个字段分成两个重要的字段:
将高度设置为我需要分离的任何值。
XML:
...//some view up here
<TextView
android:id="@+id/dialogSeparator"
android:layout_width="match_parent"
android:layout_height="30dp"
android:visibility="gone"/>
...//some view down here
现在,我的代码,我需要做的只是简单地将可见性改为隐形(即它在那里,并占用所需的空间,但它是看不见的)
JAVA:
TextView tvSeparator = (TextView)activity.findViewById(R.id.dialogSeparator);
tvSeparator.setVisibility(View.INVISIBLE);
//Inside an activity extended class I can use 'this' instead of 'activity'.
Viola ......我得到了所需的保证金。 BTW,此解决方案适用于具有垂直方向的LinearLayout,但您可以使用不同的布局。
希望这有帮助。
答案 6 :(得分:0)
您可能在绘制后更改了布局边距。 mOldTextView.invalidate()没用。您需要在父级上调用requestLayout()以重新布局新配置。在绘图发生之前移动布局更改代码时,一切正常。
答案 7 :(得分:0)
TextView tv = (TextView)findViewById(R.id.item_title));
RelativeLayout.LayoutParams mRelativelp = (RelativeLayout.LayoutParams) tv
.getLayoutParams();
mRelativelp.setMargins(DptoPxConvertion(15), 0, DptoPxConvertion (15), 0);
tv.setLayoutParams(mRelativelp);
private int DptoPxConvertion(int dpValue)
{
return (int)((dpValue * mContext.getResources().getDisplayMetrics().density) + 0.5);
}
textview的getLayoutParams()应根据 xml 中textview的父对象,转换为相应的Params。
<RelativeLayout>
<TextView
android:id="@+id/item_title">
</RelativeLayout>
要在不同设备上呈现相同的实际大小,请使用我上面使用的DptoPxConvertion()方法。 setMargin(left,top,right,bottom)params将在像素中使用值而不是dp 。如需进一步参考,请参阅 Link Answer