2011-01-27 89 views
76

我將TextView添加到了LinearLayout中,並且在一些外部事件中,我想將該TextView的底部邊距減小到-10,爲此我嘗試了下面的內容。如何更改TextView的頁邊距

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

修改已添加到視圖的小部件的邊距是否正確?
一些它如何不工作。

回答

5

setMargins()設置TextView的INNER邊距,而不是佈局邊距。那是你想要做的嗎?這兩個不同的利潤可能相當複雜。

如果要設置佈局邊距,請更改TextView的LayoutParams(textview.getLayoutParams(),然後更改返回的LayoutParams對象上的參數)。

您不需要更改LinearLayout上的任何內容。

問候, 奧利弗

174
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中給出了值,這就是爲什麼你的代碼無法工作。 您只需將此代碼放置在您創建視圖引用的位置。

+0

固體。謝謝... – trgraglia

+0

這個調用需要API級別爲19. –

+4

@SanjayKumar - 不,沒有限制,它需要API級別19 – Debarati

1

TextView不支持setMargins。 Android docs說:

即使視圖可以定義填充,它不提供任何支持邊距。但是,查看組提供了這樣的支持。有關更多信息,請參閱ViewGroup和ViewGroup.MarginLayoutParams。

58

你在XML的佈局可能已經有一個layout_margin在它(左| |右等)的屬性,這意味着你需要訪問由XML生成的對象,並對其進行修改。

我發現這個解決方案很簡單:

ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) mTextView 
     .getLayoutParams(); 

mlp.setMargins(adjustmentPxs, 0, 0, 0); 

break; 

讓您的TextView的實例的LayoutParams,其向下轉換到MarginLayoutParams,並使用setMargins方法來設置頁邊距。

+0

這給了我ClassCastException: - > ViewGroup.LayoutParams不能轉換爲ViewGroup.MarginLayoutParams –

10

這是一個棘手的問題,我將margin設置爲表格佈局的行中的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;

所以相應地使用。

0

您可能在繪製後更改佈局邊距。 mOldTextView.invalidate()沒用。您需要調用父級的requestLayout()來重新佈局新配置。在繪圖發生之前移動佈局更改代碼時,一切正常。

1

這裏是另一種方法...

當我有同樣的問題,我不喜歡這裏建議的解決方案。 所以,我想出了另一種方式: 我所插入的兩個領域,我想有兩個重要的領域分離的XML文件中的一個TextView:

  1. 可見性設置爲「GONE」(沒有按't佔據任何空間..)
  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'. 

維奧拉......我得到了必要的保證金。 順便說一句,此解決方案適用於垂直方向的LinearLayout,但您可以使用不同的佈局。

希望這會有所幫助。的TextView的

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

getLayoutParams()應基於在XML的父TextView的的被鑄造成相應PARAMS。

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

爲了使在不同的設備相同的實際尺寸用我所上面使用DptoPxConvertion()方法。 setMargin(左,上,右,下)params將取像素值,而不是dp。進一步參考請看Link Answer