web-dev-qa-db-ja.com

android動的にビューを挿入するとマージンが機能しない

私は単純な見解を持っています:

<?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);

これは次のようになります。

enter image description here

メインレイアウトのコンテナは、Horizo​​ntalScrollViewの子であるLinearLayoutです。どんな洞察もありがたいです。

21
John Ward

ビューを動的に追加する場合、ViewnullViewGroup親で膨らませないでください。したがって、言い換えれば、inflater.inflate(R.layout.test, linearLayout, false);を使用する必要があります。親は、生成するレイアウトパラメータのタイプを決定するときに使用されます。親コンテナー(この場合は線形レイアウト)を渡すと、XMLから ViewGroup.MarginLayoutParams が正しくインスタンス化されます。

39
Submersed

これは、レイアウトに "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);

それが役に立てば幸い。

3

まず、表示密度を取得する必要があります。関連ドキュメントは 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を独自のビューに変更することもできます。

0
Daniel.Kwak