私は単純な見解を持っています:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:background="@drawable/contact_selected"
Android:layout_marginTop="10dp"
Android:layout_marginEnd="5dp"
Android:orientation="horizontal"
Android:padding="3dp">
<TextView
Android:id="@+id/txt_title"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Billy Bob"
/>
</LinearLayout>
LinearLayoutマークアップをメインアクティビティレイアウトに静的にコピーすると、マージンが期待どおりになります。ただし、ビューをメインアクティビティレイアウトに動的に追加すると、マージンが無視されます。これが私がビューを挿入する方法です
LayoutInflater inflater = (LayoutInflater)
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.test, null);
TextView txt_title = (TextView)view.findViewById(R.id.txt_title);
txt_title.setText("Dynamic #1");
llayout.addView(view, llayout.getChildCount()-1);
View view2 = inflater.inflate(R.layout.test, null);
txt_title = (TextView)view2.findViewById(R.id.txt_title);
txt_title.setText("Dynamic #2");
llayout.addView(view2, llayout.getChildCount()-1);
これは次のようになります。
メインレイアウトのコンテナは、HorizontalScrollViewの子であるLinearLayoutです。どんな洞察もありがたいです。
ビューを動的に追加する場合、View
をnull
ViewGroup
親で膨らませないでください。したがって、言い換えれば、inflater.inflate(R.layout.test, linearLayout, false);
を使用する必要があります。親は、生成するレイアウトパラメータのタイプを決定するときに使用されます。親コンテナー(この場合は線形レイアウト)を渡すと、XMLから ViewGroup.MarginLayoutParams が正しくインスタンス化されます。
これは、レイアウトに "Margin"を動的に与える必要があるために発生します。これを行うには、次のように "LayoutPrams"のオブジェクトを作成します。
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);
ここでは、LayoutParamsをlinearlayoutに設定できます。
ll.addView(okButton, layoutParams);
それが役に立てば幸い。
まず、表示密度を取得する必要があります。関連ドキュメントは https://developer.Android.com/reference/Android/util/DisplayMetrics.html
マージンビューを設定したいIDを取得します。私の場合、
layout_login_box = (ConstraintLayout)findViewById(R.id.login_layout_box);
float density = getResources().getDisplayMetrics().density;
ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams)layout_login_box.getLayoutParams();
params.setMargins((int) (24 * density),0,(int) (24 * density),(int) (16 * density));
layout_login_box.setLayoutParams(params);
また、ConstraintLayoutを独自のビューに変更することもできます。