【问题标题】:How to Change Margin of TextView如何更改 TextView 的边距
【发布时间】:2011-06-16 09:27:20
【问题描述】:

我已将 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();

修改已添加到视图的小部件的边距是否正确?
一些它不工作的原因。

【问题讨论】:

    标签: android


    【解决方案1】:

    这是一个棘手的问题,我在表格布局的一行中将边距设置为 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;
    

    导入 android.widget.LinearLayout.LayoutParams;

    所以相应地使用。

    【讨论】:

      【解决方案2】:
      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 中给出值时,这就是您的代码不起作用的原因。 您只需将此代码放在创建视图引用的位置即可。

      【讨论】:

      • 此调用需要 API 级别 19。
      • @SanjayKumar - 不,没有限制它需要 API 级别 19
      • 这如何回答 OP 的问题?似乎代码是相同的,除了冗余的额外行设置触摸侦听器,没有调用 invalidate(),并且没有在 LinearLayout.LayoutParams [LayoutParams.WRAP_CONTENT vs LinearLayout.LayoutParams.WRAP_CONTENT] 的构造函数中明确说明参数?此外(没关系),OP 要求在以编程方式创建的 TextView 上设置边距,尽管答案是通过 findViewById() 从布局 xml 获得 TextView。我很好奇我在这里错过了什么......
      • @Melquiades 同意你的观点,因为它没有回答问题,所以作为选择的答案被删除,也正如答案中提到的Maybe as you are giving the value in -ve 边距可以是 -ve 值。
      【解决方案3】:
              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 的Parent 转换成对应的Params。

      <RelativeLayout>
         <TextView
          android:id="@+id/item_title">
      </RelativeLayout>
      

      要在不同的设备上渲染相同的实际尺寸,请使用我上面使用过的 DptoPxConvertion() 方法。 setMargin(left,top,right,bottom) 参数将采用 像素值而不是 dp。如需进一步参考,请参阅此 Link Answer

      【讨论】:

        【解决方案4】:

        这是另一种方法...

        当我遇到同样的问题时,我不喜欢这里建议的解决方案。 所以,我想出了另一种方法: 我在 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
          

        现在,我是代码,我需要做的只是将可见性更改为不可见(即它在那里,并占用所需的空间,但它是看不见的)

            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...我得到了所需的利润。 顺便说一句,此解决方案适用于垂直方向的 LinearLayout,但您可以使用不同的布局。

        希望这会有所帮助。

        【讨论】:

          【解决方案5】:

          您可能在绘制后更改了布局边距。 mOldTextView.invalidate() 没用。您需要在父级上调用 requestLayout() 来重新布局新配置。当您在绘图发生之前移动布局更改代码时,一切正常。

          【讨论】:

            【解决方案6】:

            您在xml中的布局可能已经有一个layout_margin(Left|Right|etc)属性,这意味着您需要访问该xml生成的对象并对其进行修改。

            我发现这个解决方案非常简单:

            ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) mTextView
                    .getLayoutParams();
            
            mlp.setMargins(adjustmentPxs, 0, 0, 0);
            
            break;
            

            获取文本视图的 LayoutParams 实例,将其向下转换为 MarginLayoutParams,然后使用 setMargins 方法设置边距。

            【讨论】:

            • 这给了我 ClassCastException:-> ViewGroup.LayoutParams 不能转换为 ViewGroup.MarginLayoutParams
            【解决方案7】:

            TextView 不支持 setMargins。 Android docs说:

            尽管视图可以定义内边距,但它不提供对边距的任何支持。但是,视图组提供了这样的支持。有关详细信息,请参阅 ViewGroup 和 ViewGroup.MarginLayoutParams。

            【讨论】:

              【解决方案8】:

              setMargins() 设置 TextView 的内部边距,而不是布局边距。那是你想做的吗?这两个不同的边距可能相当复杂。

              如果要设置布局边距,更改TextView的LayoutParams(textview.getLayoutParams(),然后更改返回的LayoutParams对象的参数)。

              您无需更改 LinearLayout 上的任何内容。

              问候, 奥利弗

              【讨论】:

                猜你喜欢
                • 2018-11-22
                • 2018-03-01
                • 2016-11-09
                • 2011-07-05
                • 2012-01-17
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多