2010-10-11 3 views
35

J'ai rencontré ce problème lors de la mise à jour de mon arrière-plan pour utiliser une image de 9 patchs. La mise en page est bien sur différents écrans en utilisant différentes tailles de la même image, mais quand je change l'image pour être un 9-patch, il brise mystérieusement toute la disposition.Mise en page Android brisée avec un fond de 9 patchs

La mise en page précédente ressemble à ceci:

Original layout http://onik.org/android/layoutOk.png.

Lorsque changé à 9-patch:

9-Patch image http://onik.org/android/layoutError.png.

Le fichier XML est resté le même, seuls les fichiers PNG ont été modifiés.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@drawable/bg"> 

    <TextView 
     android:text="@string/title" 
     android:id="@+id/login_title" 
     android:layout_width="fill_parent" 
     android:layout_height="40px" 
     android:textSize="30px"> 
    </TextView> 

    <View 
     android:id="@+id/login_underline" 
     android:layout_width="wrap_content" 
     android:layout_height="2px" 
     android:background="#aaaaaa"> 
    </View> 

    <TableLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="1" 
     android:stretchColumns="1" 
     android:gravity="center" 
     android:paddingLeft="10px" 
     android:paddingRight="10px"> 

     <TableRow> 
      <TextView 
       android:id="@+id/login_usernameLabel" 
       android:text="@string/login_usernameLabel" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:paddingRight="5px"> 
      </TextView> 

      <EditText 
       android:text="" 
       android:id="@+id/login_username" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:inputType="textEmailAddress" 
       android:lines="1" 
       android:nextFocusDown="@+id/login_password"> 
      </EditText> 

     </TableRow> 

     <TableRow> 

      <TextView 
       android:id="@+id/login_passwordLabel" 
       android:text="@string/login_passwordLabel" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content"> 
      </TextView> 

      <EditText 
       android:text="" 
       android:id="@+id/login_password" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:nextFocusDown="@+id/login_login" 
       android:inputType="textPassword"> 
      </EditText> 

     </TableRow> 

     <TableRow android:gravity="right"> 

      <Button 
       android:text="@string/login_login" 
       android:id="@+id/login_login" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content"> 
      </Button> 


    </TableRow> 

     <TableRow> 

      <CheckBox 
       android:id="@+id/login_remember" 
       android:text="@string/login_remember" 
       android:layout_span="2"> 
      </CheckBox> 

     </TableRow> 

</TableLayout> 


</LinearLayout> 

Des idées? Ou d'autres solutions pour obtenir un arrière-plan centré sans échelle?

+8

Pourriez-vous re-télécharger les images ici –

+0

Oh, désolé, j'ai oublié qu'ils étaient liés ici, je vais essayer de voir si j'ai de vieilles sauvegardes à la maison, mais je pense qu'ils sont partis ... – onik

+0

Vous avez sauvé ma journée.C'était très difficile à déboguer.Merci !!! –

Répondre

99

cela signifie ajouter simplement attribut

android:padding="0dip" 

à votre balise de mise en page

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@drawable/bg" 
    android:padding="0dip"> 

Mise à jour:

Android Docs a l'explication exacte:

"Vous pouvez également définir une section de l'image pouvant être dessinée (en fait, les lignes de remplissage) en dessinant une ligne sur les lignes de droite et de fond. Si un objet View définit le NinePatch comme arrière-plan, puis spécifie le texte de la vue, il s'étire de sorte que tout le texte ne rentre que dans la zone désignée par les lignes droite et inférieure (si elle est incluse). Si les lignes de remplissage ne sont pas incluses, Android utilise les lignes de gauche et de haut pour définir cette zone de dessin. "

Pour ignorer ce comportement par défaut, nous devons définir le remplissage d'attributs explicitement en XML mise en page

+0

Merci :) Mais savez-vous pourquoi cela fonctionne? Ou quel est le bug? –

+2

http://developer.android.com/guide/developing/tools/draw9patch.html les côtés droit et inférieur définissent le rembourrage à l'intérieur de l'image 9-patch. Vous devez définir ces paddings soit dans l'image 9-patch ou explicitement dans la mise en page xml – vokilam

+0

@VokilaM, je voudrais savoir où ci-dessus des informations précieuses est mentionné sur les documents android. Votre solution a également résolu mon problème. – JRC

3

Résolu le problème, ma zone de remplissage sur le 9-patch ne convenait pas. Lorsque j'ai dessiné la zone de remplissage comme l'inverse de la zone extensible, l'image a commencé à travailler. Je pensais juste que cela aurait été automatique si aucune zone de remplissage était présent :)

+0

Vous pouvez choisir la réponse ci-dessus - J'ai eu le même problème que vous avez décrit et mis ting padding à 0 résolu le problème – Bostone

+0

Je pensais la même chose .. quelle perte de temps .. travaillé .. merci à VokilaM – user606669

0

Utilisez 9-patch définir la ligne de contenu (à droite et en bas)!

Questions connexes