web-dev-qa-db-ja.com

プログラムでビューの右マージンを変更しますか?

この属性はJavaコードで動的に変更できますか?

Android:layout_marginRight

TextViewがあります。これは、位置を数ピクセル左に動的に変更する必要があります。

プログラムでそれを行う方法は?

152

編集:レイアウトタイプに依存しないこれを行うより一般的な方法(マージンをサポートするレイアウトタイプ以外):

public static void setMargins (View v, int l, int t, int r, int b) {
    if (v.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
        ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) v.getLayoutParams();
        p.setMargins(l, t, r, b);
        v.requestLayout();
    }
}

TextView のドキュメントを確認する必要があります。基本的に、TextViewのLayoutParamsオブジェクトを取得し、マージンを変更してから、TextViewに戻します。 LinearLayoutにあると仮定して、次のようなものを試してください。

TextView tv = (TextView)findViewById(R.id.my_text_view);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)tv.getLayoutParams();
params.setMargins(0, 0, 10, 0); //substitute parameters for left, top, right, bottom
tv.setLayoutParams(params);

私は今それをテストすることができないので、私のキャストは少しずれているかもしれませんが、LayoutParamsはマージンを変更するために修正する必要があるものです。

注意

TextViewが内部にある場合、たとえば、RelativeLayoutを使用することを忘れないでくださいRelativeLayout.LayoutParamsLinearLayout.LayoutParamsの代わりに

420
kcoppock

LayoutParamsを使用します(既に説明したとおり)。ただし、どのLayoutParamsを選択するかに注意してください。 https://stackoverflow.com/a/11971553/3184778 「実際のビューではなく、作業中のビューの親に関連するものを使用する必要があります」

たとえば、TextViewがTableRow内にある場合、RelativeLayoutまたはLinearLayoutの代わりにTableRow.LayoutParamsを使用する必要があります。

15
kouretinho

マージンのすべてのタイプを設定するには、この関数を使用します

      public void setViewMargins(Context con, ViewGroup.LayoutParams params,      
       int left, int top , int right, int bottom, View view) {

    final float scale = con.getResources().getDisplayMetrics().density;
    // convert the DP into pixel
    int pixel_left = (int) (left * scale + 0.5f);
    int pixel_top = (int) (top * scale + 0.5f);
    int pixel_right = (int) (right * scale + 0.5f);
    int pixel_bottom = (int) (bottom * scale + 0.5f);

    ViewGroup.MarginLayoutParams s = (ViewGroup.MarginLayoutParams) params;
    s.setMargins(pixel_left, pixel_top, pixel_right, pixel_bottom);

    view.setLayoutParams(params);
}
9
Rohit Rathore

Kotlinでは、次のような拡張関数を宣言できます。

fun View.setMargins(
    leftMarginDp: Int? = null,
    topMarginDp: Int? = null,
    rightMarginDp: Int? = null,
    bottomMarginDp: Int? = null
) {
    if (layoutParams is ViewGroup.MarginLayoutParams) {
        val params = layoutParams as ViewGroup.MarginLayoutParams
        leftMarginDp?.run { params.leftMargin = this.dpToPx(context) }
        topMarginDp?.run { params.topMargin = this.dpToPx(context) }
        rightMarginDp?.run { params.rightMargin = this.dpToPx(context) }
        bottomMarginDp?.run { params.bottomMargin = this.dpToPx(context) }
        requestLayout()
    }
}

fun Int.dpToPx(context: Context): Int {
    val metrics = context.resources.displayMetrics
    return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this.toFloat(), metrics).toInt()
}

その後、次のように呼び出すことができます。

myView1.setMargins(8, 16, 34, 42)

または:

myView2.setMargins(topMarginDp = 8) 
1
David Miguel