177 votes

Donner du sens aux LayoutInflater

J’ai eu de graves difficultés à obtenir des LayoutInflater à fonctionner comme prévu, et n’a donc autrui (help-for-using-layoutinflator-to-add-views-at-runtime).

La question est : pourquoi les LayoutInflater ignore les paramètres de mise en page, j’ai spécifié ? Par exemple, pourquoi les valeurs layout_width et layout_height de mes ressources que XML pas honoré ?

409voto

andig Points 3133

J'ai étudié cette question, en se référant à la LayoutInflater docs et la création d'un petit échantillon de démonstration du projet. Les didacticiels suivants montre comment remplir dynamiquement une mise en page à l'aide de LayoutInflater.

Avant de commencer à voir ce qu' LayoutInflater.inflate() paramètres de ressembler à:

  • ressources: ID d'un XML disposition de ressources à charge (par exemple, R.layout.main_page)
  • racine: Facultatif vue d'être le parent de la hiérarchie (si attachToRoot est true), ou simplement un objet qui fournit un ensemble d' LayoutParams des valeurs de la racine de la hiérarchie (si attachToRoot est false.)
  • attachToRoot: Si le gonflés hiérarchie doit être rattaché à la racine de paramètre? Si la valeur est false, la racine est utilisée uniquement pour créer le bon sous-classe de la LayoutParams pour la vue racine dans le fichier XML.

  • Retourne: La Vue de la racine de la gonflés hiérarchie. Si racine a été fourni et attachToRoot est true, c'est la racine; sinon, il est la racine de l'gonflé fichier XML.

Maintenant, pour l'exemple de mise en page et le code.

Page principale (main.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</LinearLayout>

Ajouté dans ce conteneur est séparé TextView, visible en tant que petit carré rouge si les paramètres de mise en page sont appliquées avec succès à partir de XML (red.xml):

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="25dp"
    android:layout_height="25dp"
    android:background="#ff0000"
    android:text="red" />

Maintenant, LayoutInflater est utilisé avec plusieurs variations de paramètres d'appel

public class InflaterTest extends Activity {

    private View view;

    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      setContentView(R.layout.main);
      ViewGroup parent = (ViewGroup) findViewById(R.id.container);

      // result: layout_height=wrap_content layout_width=match_parent
      view = LayoutInflater.from(this).inflate(R.layout.red, null);
      parent.addView(view);

      // result: layout_height=100 layout_width=100
      view = LayoutInflater.from(this).inflate(R.layout.red, null);
      parent.addView(view, 100, 100);

      // result: layout_height=25dp layout_width=25dp
      // view=textView due to attachRoot=false
      view = LayoutInflater.from(this).inflate(R.layout.red, parent, false);
      parent.addView(view);

      // result: layout_height=25dp layout_width=25dp 
      // parent.addView not necessary as this is already done by attachRoot=true
      // view=root due to parent supplied as hierarchy root and attachRoot=true
      view = LayoutInflater.from(this).inflate(R.layout.red, parent, true);
    }
}

Les résultats réels de la variation des paramètres sont documentées dans le code.

SYNOPSIS: en Appelant LayoutInflater sans spécifier la racine conduit à gonfler appel d'ignorer les paramètres de mise en page à partir du XML. L'appel de gonfler avec de la racine de pas égal null et attachRoot=true ne charger les paramètres de mise en page, mais renvoie la racine de l'objet nouveau, qui empêche d'autres modifications de la configuration de l'objet chargé (sauf si vous pouvez le trouver à l'aide de findViewById()). La convention d'appel vous avez probablement souhaitez utiliser est donc celui-ci:

loadedView = LayoutInflater.from(context)
                .inflate(R.layout.layout_to_load, parent, false);

Pour aider avec les problèmes d'implantation, la hiérarchie de la visionneuse est fortement recommandé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X