でこれ、これそしてこれスレッド 単一のビューの余白を設定する方法についての答えを見つけようとしました。しかし、もっと簡単な方法はないのかと思いました。なぜこの方法を使用したくないのかを説明します。
Button を拡張するカスタム Button があります。背景がデフォルトの背景以外に設定されている場合 (setBackgroundResource(int id)
または のいずれかを呼び出すことによってsetBackgroundDrawable(Drawable d)
)、余白を 0 にします。これを呼び出すと:
public void setBackgroundToDefault() {
backgroundIsDefault = true;
super.setBackgroundResource(android.R.drawable.btn_default);
// Set margins somehow
}
マージンを-3dpにリセットしたい(すでに読んだここピクセルから dp に変換する方法を知っているので、余白を px に設定する方法がわかれば、自分で変換を管理できます。ただし、これはクラスで呼び出されるためCustomButton
、親は LinearLayout から TableLayout まで変化する可能性があり、親を取得してその親のインスタンスをチェックするのは避けたいです。これもかなりパフォーマンスが悪いと思います。
また、(LayoutParams を使用して) を呼び出すときにparentLayout.addView(myCustomButton, newParams)
、これが正しい位置に追加されるかどうかはわかりません (ただし、試していません)。たとえば、5 行の中央のボタンに追加されます。
質問: LayoutParams を使用する以外に、プログラムで単一のボタンの余白を設定するより簡単な方法はありますか?
編集: LayoutParams の方法は知っていますが、それぞれの異なるコンテナー タイプを処理しなくても済むソリューションが欲しいです。
ViewGroup.LayoutParams p = this.getLayoutParams();
if (p instanceof LinearLayout.LayoutParams) {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
else if (p instanceof RelativeLayout.LayoutParams) {
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
else if (p instanceof TableRow.LayoutParams) {
TableRow.LayoutParams lp = (TableRow.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
}
は、、、、の属性を持たない をthis.getLayoutParams();
返すためです。表示される mc インスタンスは、オフセット (-3dp) マージンと (oml、omr、omt、omb) および元のマージン (ml、mr、mt、mb) を含む です。ViewGroup.LayoutParams
topMargin
bottomMargin
leftMargin
rightMargin
MarginContainer
ベストアンサー1
LayoutParams
ボタンの余白を設定するには、以下を使用する必要があります。
LayoutParams params = new LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT
);
params.setMargins(left, top, right, bottom);
yourbutton.setLayoutParams(params);
使用しているレイアウトに応じて、RelativeLayout.LayoutParams
または を使用する必要がありますLinearLayout.LayoutParams
。
dp の測定値をピクセルに変換するには、次を試してください。
Resources r = mContext.getResources();
int px = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
yourdpmeasure,
r.getDisplayMetrics()
);