如何更改TextView的边距

时间:2011-01-27 08:26:34

标签: android

我已将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的窗口小部件的边距是否正确?
一些如何不起作用。

8 个答案:

答案 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,我希望将这两个字段分成两个重要的字段:

  1. 可见性设置为“GONE”(不占用任何空间..)
  2. 将高度设置为我需要分离的任何值。

    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
    
  3. 现在,我的代码,我需要做的只是简单地将可见性改为隐形(即它在那里,并占用所需的空间,但它是看不见的)

        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