J'essaie d'écrire ma propre coutume View
et j'ai un problème avec LayoutParams
.
L’idée est d’étendre ViewGroup
(LinearLayout
)
public class MyView extends LinearLayout{
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyView(Context context) {
super(context);
}
public void putContent(){
setOrientation(HORIZONTAL);
LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
for (int i = 0; i < 5; i++){
View view = inflater.inflate(R.layout.item, null);
TextView tv = (TextView)view.findViewById(R.id.item_text);
tv.setText("Item " + i);
addView(view);
}
}
}
Comme vous pouvez le voir, la méthode putContent
gonfle un élément et l’ajoute à mon avis. Voici une mise en page
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="#FFFFFF">
<TextView Android:text="TextView"
Android:id="@+id/item_text"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textColor="#000000"/>
</LinearLayout>
Et la disposition de l'écran principal
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent" Android:orientation="vertical">
<TextView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android_layout_weight="1"
Android:text="@string/hello"
/>
<my.test.MyView
Android:id="@+id/my_view"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android_layout_weight="1"
/>
</LinearLayout>
Et code d'activité
public class Start extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
MyView myView = (MyView)findViewById(R.id.my_view);
myView.putContent();
}
}
Voici une capture d'écran de ce que je reçois
Le problème est donc le suivant: les attributs de l'élément racine de l'élément sont ignorés
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Mais dans le résultat je veux obtenir quelque chose comme ceci (j'obtiens ce résultat quand remplace addView(view);
par cette ligne)
addView(view, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1F));
La question est donc: comment obtenir ce résultat sans LayoutParams codés en dur? Merci pour toute aide!
mettre à jour
Je regarde également les champs de variable view
en mode débogage - la mLayoutParams
est null
et n'est pas devenue nulle lorsque j'ajoute view
gonflé dans le parent avec addView(view, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1F));
.
Mais mLayoutParams
de l'enfant de la vue qui vient d'être chargée n'est pas nul. Pourquoi LayoutParams de l'élément racine uniquement dans la présentation XML est-il ignoré lorsque la vue est gonflée?
Utilisez la déclaration suivante pour gonfler:
View view = inflater.inflate( R.layout.item /* resource id */,
MyView.this /* parent */,
false /*attachToRoot*/);
Ok, si je comprends bien, vous avez le code XML mentionné ci-dessus dans ll
et vous ajoutez quelque chose (R.layout.item_layout
) à celui-ci.
Les problèmes que je vois sont:
ll
) a match_parent
, mais nous ne savons pas si elle a même un parent. Donc, le comportement est difficile à deviner.R.layout.item_layout
n'est pas le xml que vous avez affiché). Il pourrait donc s'agir d'un comportement attendu, voire indéfini (donc attendu qu'il soit inattendu).Il se peut qu’il y ait trop de code à publier ici, je ne sais pas, mais vous feriez peut-être mieux d’utiliser le visualisateur de hiérarchie pour vérifier les paramètres de la vue dans votre arborescence. voir ce qui se passe.
Notez également que toutes les vues ne prennent pas en charge la marge .
Même si une vue peut définir un remplissage , Elle ne fournit aucun support Pour les marges. Cependant, les groupes de vues Fournissent un tel soutien. Reportez-vous à À ViewGroup et à ViewGroup.MarginLayoutParams pour plus d'informations sur .
Dans Android, les paramètres "layout_" font référence à la manière dont la vue actuelle se comporte dans sa mise en page parent. Dans ce cas, son parent est ll, mais on ne voit pas ce que c'est.
En ce qui concerne la présentation de TextView dans LinearLayout, celui-ci étant vertical, tous ses enfants voient automatiquement layout_height remplacé par "wrap_content" afin de pouvoir être disposés correctement l'un sous l'autre.
Alors maintenant la question est, que voyez-vous réellement et que voulez-vous voir?