TextViewのマージンを変更する方法


82

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

ビューに追加されたウィジェットのマージンを変更する正しい方法はありますか?
それがどのように機能していないか。

回答:


187
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が必要です
サンジェイ・クマール

4
@ SanjayKumar-いいえ、APIレベル19が必要であるという制約はありません
Debarati 2014年

1
これはOPの質問にどのように答えますか?冗長な余分な行設定タッチリスナー、invalidate()を呼び出さないこと、およびコンストラクターでLinearLayout.LayoutParams [LayoutParams.WRAP_CONTENT vs LinearLayout.LayoutParams.WRAP_CONTENT]に引数を明示的に記述しないことを除いて、コードは同じようです。さらに(問題ではない)、OPはプログラムで作成されたTextViewにマージンを設定するように求めていますが、答えはfindViewById()を介してレイアウトxmlからTextViewを取得します。私は...私はここに欠けているものを好奇心が強い
Melquiades

@Melquiadesはあなたに同意します。質問に回答しないため、選択した回答として削除されます。また、回答のMaybe as you are giving the value in -ve余白に記載されているように、-ve値にすることもできます。
user7723337 2015

61

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にキャストできません
Harshil Pansare 2017

10

これはトリッキーな問題です。テーブルレイアウトの行の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;

したがって、それに応じて使用してください。


5

setMargins()は、layout-marginsではなく、TextViewのINNERマージンを設定します。それはあなたがしたいことですか?この2つの異なるマージンは、非常に複雑になる可能性があります。

レイアウトマージンを設定する場合は、TextViewのLayoutParamsを変更します(textview.getLayoutParams()、次に返されたLayoutParamsオブジェクトのパラメーターを変更します)。

LinearLayoutで何も変更する必要はありません。

よろしく、オリバー


3

TextViewはsetMarginsをサポートしていません。Androidドキュメントによると:

ビューはパディングを定義できますが、マージンはサポートされていません。ただし、ビューグループはそのようなサポートを提供します。詳細については、ViewGroupおよびViewGroup.MarginLayoutParamsを参照してください。


1

ここに別のアプローチがあります...

同じ問題が発生したとき、ここで提案されている解決策が気に入らなかった。そこで、別の方法を考え出しました。XMLファイルの2つの重要なフィールドで分離したい2つのフィールドの間に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'.

ヴィオラ...必要なマージンを得ました。ところで、このソリューションは垂直方向のLinearLayout用ですが、さまざまなレイアウトで実行できます。

お役に立てれば。


0

おそらく、描画後にレイアウトマージンを変更していました。mOldTextView.invalidate()は役に立ちません。新しい構成をリレーアウトするには、親でrequestLayout()を呼び出す必要がありました。描画が行われる前にレイアウト変更コードを移動すると、すべてが正常に機能しました。


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ではなくピクセル単位の値を取ります。詳細については、このリンク回答を参照してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.