では、この、この、およびこのスレッドは私が単一のビューにマージンを設定する方法についての答えを見つけることを試みました。しかし、もっと簡単な方法はないのかと思っていました。このアプローチを使いたくない理由を説明します。
ボタンを拡張するカスタムボタンがあります。背景がデフォルトの背景以外に設定されている場合(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を使用する以外に、プログラムで1つのボタンのマージンを設定する簡単な方法はありますか?
編集:私は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();
戻りViewGroup.LayoutParams
属性を持っていません、topMargin
、bottomMargin
、leftMargin
、rightMargin
。表示されるmcインスタンスは、MarginContainer
オフセット(-3dp)マージンと(oml、omr、omt、omb)と元のマージン(ml、mr、mt、mb)を含む単なるa です。