私はJava( XML ではない)を使って、画面いっぱいに余白のあるボタンでLinearLayoutを作成しようとしています。余白なしで動作するコードは次のとおりです。
LinearLayout buttonsView = new LinearLayout(this);
buttonsView.setOrientation(LinearLayout.VERTICAL);
for (int r = 0; r < 6; ++r) {
Button btn = new Button(this);
btn.setText("A");
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT); // Verbose!
lp.weight = 1.0f; // This is critical. Doesn't work without it.
buttonsView.addView(btn, lp);
}
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
setContentView(buttonsView, lp);
それでうまくいきますが、ボタンマージンをどのようにしてそれらの間にスペースができるのですか。私はLinearLayout.MarginLayoutParams
を使用しようとしました、しかしそれはweight
メンバーを持っていないのでそれはダメです。そしてコンストラクタでlp
を渡してもうまくいきません。
これは不可能ですか?それは確かにそれを見て、そしてそれはあなたがXMLでしかすることができる最初のAndroidレイアウトタスクではないだろうから。
これを実現するための小さなコードを次に示します。
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(30, 20, 30, 0);
Button okButton=new Button(this);
okButton.setText("some text");
ll.addView(okButton, layoutParams);
それでうまくいきますが、ボタンマージンをどのようにしてそれらの間にスペースができるのですか。
LinearLayout.LayoutParams
オブジェクトに対してsetMargins()
を呼び出します。
私はLinearLayout.MarginLayoutParamsを使ってみましたが、それはウェイトメンバーを持っていないのでそれはダメです。
ドキュメント に示されているように、LinearLayout.LayoutParams
はLinearLayout.MarginLayoutParams
のサブクラスです。
これは不可能ですか?
いいえ.
xMLでしかできない最初のAndroidレイアウトタスクではないでしょう
あなたはこの主張の証明を供給することを歓迎します。
個人的には、私はXMLを介してのみ達成でき、SDKのJavaメソッドを介して達成できるものは何も知りません。実際、XMLは実行可能コードではないため、定義上、すべてがJava経由で実行可能である必要があります(必ずしもSDKにアクセス可能なメソッド経由ではありません)。しかし、何かを知っているのであれば指摘してください。これはSDKのバグであり、いつの日か修正されるはずです。
余白をアイテムに直接追加するには(一部のアイテムでは余白を直接編集できます)、次の操作を実行できます。
LayoutParams lp = ((ViewGroup) something).getLayoutParams();
if( lp instanceof MarginLayoutParams )
{
((MarginLayoutParams) lp).topMargin = ...;
((MarginLayoutParams) lp).leftMargin = ...;
//... etc
}
else
Log.e("MyApp", "Attempted to set the margins on a class that doesn't support margins: "+something.getClass().getName() );
...これは周囲のレイアウトについて知る/編集する必要なしに動作します。余白をサポートしていないものに対してこれを試して実行した場合の "instanceof"チェックに注意してください。
デバイス画面のピクセル密度のばらつきのため、プログラム的にマージンを設定するために常にDIP
unitを使用するのが良いでしょう。 below_のように
//get resources
Resources r = getResources();
float pxLeftMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxTopMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxRightMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxBottomMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, r.getDisplayMetrics());
//get layout params...
LayoutParams params=new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
params.setMargins(Math.round(pxLeftMargin), Math.round(pxTopMargin), Math.round(pxRightMargin), Math.round(pxBottomMargin));
//set margin...
yourLayoutTOsetMargin.setLayoutParams(params);
これが役立つことを願っています。
以下のコードを使用して直接マージンを設定しました
LinearLayout layout = (LinearLayout)findViewById(R.id.yourrelative_layout);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);
params.setMargins(3, 300, 3, 3);
layout.setLayoutParams(params);
ここでの唯一のことは、パッケージAndroid.widget.RelativeLayout.LayoutParams
に従うためにLayoutParams
をインポートすべきであることに気づくことです、さもなければエラーがあるでしょう。
MarginLayoutParams layoutParams = (MarginLayoutParams) getLayoutParams();
layoutParams.setMargins(leftMargin, topMargin, rightMargin, bottomMargin);
これを試して
LayoutParams params = new LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT
);
params.setMargins(left, top, right, bottom);
yourbutton.setLayoutParams(params);
これを試して:
MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams();
params.width = 250;
params.leftMargin = 50;
params.topMargin = 50;
/*
* invalid margin
*/
private void invalidMarginBottom() {
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) frameLayoutContent.getLayoutParams();
lp.setMargins(0, 0, 0, 0);
frameLayoutContent.setLayoutParams(lp);
}
あなたはビューのviewGroupの型に注意するべきです。例えば、上のコードで、私はframeLayoutのマージンを変更したいです、そして、frameLayoutのビューグループはaですRelativeLayout、つまり(RelativeLayout.LayoutParams)に変換する必要があります
ここで一行解決策:
((LinearLayout.LayoutParams) yourLinearLayout.getLayoutParams()).marginToAdd = ((int)(Resources.getSystem().getDisplayMetrics().density * yourDPValue));