web-dev-qa-db-fra.com

les marges android ne fonctionnent pas lors de l'insertion dynamique de vues

J'ai une vue simple:

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

Lorsque je copie de manière statique le balisage LinearLayout dans la présentation de mon activité principale, les marges sont conformes aux attentes. Cependant, lorsque j'ajoute la vue de manière dynamique dans la structure d'activité principale, les marges sont ignorées. Voici comment j'insère la vue

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

Voici à quoi ça ressemble:

 enter image description here

Le conteneur dans la présentation principale est un LinearLayout, qui est un enfant d'un HorizontalScrollView. Toute idée est appréciée.

13
John Ward

Lors de l'ajout dynamique de vues, vous ne devez pas gonfler la View avec un parent nullViewGroup. Donc, en d’autres termes, vous devriez utiliser inflater.inflate(R.layout.test, linearLayout, false);. Le parent est utilisé pour déterminer le type de paramètres de présentation à générer. Passez votre conteneur parent (dans ce cas, votre mise en page linéaire) afin qu'il instancie correctement le ViewGroup.MarginLayoutParams à partir de votre XML.

30
Submersed

Cela est dû au fait que vous devez donner " Margin " aux présentations de manière dynamique. Vous pouvez le faire en créant un objet " LayoutPrams ", comme ceci: -

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

Ici, vous pouvez définir le LayoutParams sur la linéarité:

ll.addView(okButton, layoutParams);

J'espère que ça aide.

3
Rahul Deep Singh

Vous devez d’abord obtenir la densité d’affichage. Les documents associés sont https://developer.Android.com/reference/Android/util/DisplayMetrics.html

et obtenez l'ID que vous souhaitez définir avec la vue en marge ... pour mon cas,

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

En outre, vous pouvez modifier ConstraintLayout à votre propre vue.

0
Daniel.Kwak