Je ne peux pas remplacer les attributs lors de l'utilisation de <include> dans mes fichiers de mise en page Android. Lorsque j'ai recherché des bogues, j'ai trouvé le problème 2863 refusé :
"inclure la balise est cassée (remplacer les paramètres de mise en page ne fonctionne jamais)"
Puisque Romain indique que cela fonctionne dans les suites de tests et ses exemples, je dois 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
Le boutons.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 les fichiers reçus.xml portrait et paysage ressemblent à ceci:
<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>
Qu'est-ce que je rate?
android
android-widget
Eric Burke
la source
la source
Réponses:
Je viens de trouver le problème. Tout d'abord, vous ne pouvez remplacer que les attributs layout_ *, donc l'arrière-plan ne fonctionnera pas. C'est un comportement documenté et simplement un oubli de ma part.
Le vrai problème se trouve 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 la balise <include> n'inclut pas à la fois layout_width et layout_height, l'exception RuntimeException se produit et est gérée silencieusement, même sans aucune instruction de journal.
La solution consiste à toujours inclure à la fois layout_width et layout_height lors de l'utilisation de la balise <include>, si vous souhaitez remplacer l'un des attributs layout_ *.
Mon exemple devrait changer en:
<include android:id="@+id/buttons_override" android:layout_width="fill_parent" android:layout_height="wrap_content" layout="@layout/buttons"/>
la source
J'ai soumis une demande d'amélioration pour autoriser le remplacement de tous les attributs inclus:
la source
<include>
est utilisé encore plus souvent maintenant, le remplacement d'attr est une fonctionnalité vraiment indispensableJ'ai trouvé que je manquais parfois d'inclure la balise android: id lors de l'utilisation du générateur d'interface graphique dans Eclipse. S'assurer (quand je remarque) que j'ajoute dans un TextView à partir du constructeur, l'id que j'utilise dans la disposition ListView.
<TextView android:text="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> ...
devient
<TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> ...
Au lieu d'obtenir «faux» «faux», j'obtiens :) et inclut le fonctionnement correct.
la source