29 votes

Disposition Android cassée avec un fond de 9 patchs

J'ai rencontré ce problème lors de la mise à jour de mon arrière-plan à utiliser un 9-patch de l'image. La mise en page est très bien sur les différents écrans à l'aide de différentes tailles d'une même image, mais quand je change l'image soit le 9-patch ça casse toute la mise en page mystérieusement.

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

Original layout.

Lorsqu'elles sont modifiées à 9-patch:

9-Patch image.

Le fichier XML est resté le même, il suffit de le PNG fichiers 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 non mis à l'échelle, centré à l'arrière-plan?

87voto

vokilam Points 4257

il suffit d'ajouter l'attribut

android:padding="0dip"

à votre disposition tag

<?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 option de drawable section de l'image (en fait, le remplissage des lignes) en traçant une ligne sur le droit et les lignes de fond. Si un objet de Vue définit la NinePatch comme son arrière-plan, puis spécifie l'Affichage du texte, il va s'étirer, de sorte que tout le texte s'adapte à l'intérieur de la zone désignée par le droit et les lignes de fond (si inclus). Si le rembourrage lignes ne sont pas inclus, Android utilise les haut et à gauche des lignes de définir ce drawable zone."

Ignorer ce comportement par défaut, nous avons besoin de rembourrage attribut explicitement dans le XML de mise en page

3voto

onik Points 992

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

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