この、これとこのスレッドでは、単一のビューにマージンを設定する方法についての答えを見つけようとしました。しかし、もっと簡単な方法はないのだろうかと思っていました。このアプローチを使用したくない理由を説明します。
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に変換する方法はすでにここで読んだので、ピクセルでマージンを設定する方法を知ったら、自分で変換を管理できます)。ただし、これはCustomButton
クラスで呼び出されるため、親はLinearLayoutごとに異なる可能性があります。親を取得してその親のインスタンスを確認することは避けたいと思います。それもかなりパフォーマンスが悪いと思います。
また、(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