web-dev-qa-db-fra.com

Les paramètres de présentation de la vue chargée sont ignorés

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 

enter image description here

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

enter image description here

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));. enter image description here

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?

37
Max Komarychev

Utilisez la déclaration suivante pour gonfler:

View view = inflater.inflate( R.layout.item /* resource id */,
                                         MyView.this /* parent */,
                                         false /*attachToRoot*/);
120
Karan

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:

  • Votre mise en page de base (le XML qui a été donné, chargé dans ll) a match_parent, mais nous ne savons pas si elle a même un parent. Donc, le comportement est difficile à deviner.
  • Vous n'avez pas spécifié les paramètres de présentation de l'élément que vous ajoutez (en supposant que 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 .

0
Nanne

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?

0
Tal Pressman