84 votes

Fait Android mise en page de XML ' s ' comprennent ' marche vraiment de Tag ?

Je suis incapable de passer outre les attributs lors de l'utilisation de <inclure> dans mon Android fichiers de mise en page. Quand j'ai cherché pour les bugs, j'ai trouvé Diminué Question 2863:

"tag est cassé (modification de mise en page params ne fonctionne jamais)"

Depuis Romain indique que cela fonctionne dans les suites de test et de ses exemples, je dois être en train de faire quelque chose de mal.

Mon projet est organisé comme ceci:

res/layout
  buttons.xml

res/layout-land
  receipt.xml

res/layout-port
  receipt.xml

L'buttons.xml contient quelque chose comme ceci:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

  <Button .../>

  <Button .../>
</LinearLayout>

Et le portrait et paysage receipt.xml les fichiers de ressembler à quelque chose comme:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">

  ...

  <!-- Overridden attributes never work. Nor do attributes like
       the red background, which is specified here. -->
  <include
      android:id="@+id/buttons_override"
      android:background="#ff0000"
      android:layout_width="fill_parent"
      layout="@layout/buttons"/>

</LinearLayout>

Ce qui me manque?

132voto

Eric Burke Points 2893

Je viens de trouver le problème. Tout d'abord, vous ne pouvez ignorer layout_* attributs, afin que l'arrière plan ne marchera pas. C'est documenté comportement et simplement d'un oubli de ma part.

Le vrai problème est trouvé dans LayoutInflater.java:

// We try to load the layout params set in the <include /> tag. If
// they don't exist, we will rely on the layout params set in the
// included XML file.
// During a layoutparams generation, a runtime exception is thrown
// if either layout_width or layout_height is missing. We catch
// this exception and set localParams accordingly: true means we
// successfully loaded layout params from the <include /> tag,
// false means we need to rely on the included layout params.
ViewGroup.LayoutParams params = null;
try {
   params = group.generateLayoutParams(attrs);
} catch (RuntimeException e) {
   params = group.generateLayoutParams(childAttrs);
} finally {
   if (params != null) {
     view.setLayoutParams(params);
   }
}

Si le <inclure> balise ne comprend pas les deux layout_width et layout_height, les RuntimeException se produit et silencieusement traitées, sans aucune instruction de journal même.

La solution est de toujours inclure à la fois layout_width et layout_height lors de l'utilisation de l' <inclure> balise, si vous souhaitez remplacer l'un de l'layout_* attributs.

Mon exemple doit changer:

<include
      android:id="@+id/buttons_override"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      layout="@layout/buttons"/>

10voto

Jeff Axelrod Points 8946

J'ai soumis une demande d'amélioration pour permettre à tous les attributs inclus pour être remplacée:

Supposons que j'ai deux identiques dispositions autres que les valeurs d'une TextView champ. Actuellement, je dois soit modifier la mise en page à d'exécution ou de dupliquer le fichier XML.

Par exemple, pour passer deux paramètres avec des valeurs "bonjour" et "monde" à layout1:

<include layout="@layout/layout1a" params="textView=hello|editText=world" />

layout1a.xml:

<merge><TextView text="@param/textView"><EditText hint="@param/editText"></merge>

Une autre mise en œuvre de casser l'encapsulation et permettrait la déclaration de remplacer des valeurs comme:

<include layout="@layout/layout1b" overrides="@id/textView.text=hello|@id/editText.hint=world" />

layout1b.xml:

<merge><TextView id="@+id/textView"><EditText hint="@+id/editText"></merge>

1voto

TheSolarSheriff Points 111

J’ai trouvé que je m’ennuie parfois y compris le tag android : id lorsque vous utilisez le générateur de GUI dans Eclipse. En s’assurant que (quand j’ai remarqué) que j’ai ajouter dans un TextView auprès du constructeur, l’id que j’utilise dans la layout de ListView.

devient

Au lieu d’obtenir des « faux » « false », je me  :) et inclus travailler OK.

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