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:
Le conteneur dans la présentation principale est un LinearLayout, qui est un enfant d'un HorizontalScrollView. Toute idée est appréciée.
Lors de l'ajout dynamique de vues, vous ne devez pas gonfler la View
avec un parent null
ViewGroup
. 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.
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.
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.