2010-10-11 21 views
35

Encontré este problema al actualizar mi fondo para usar una imagen de 9 parches. El diseño está bien en diferentes pantallas usando diferentes tamaños de la misma imagen, pero cuando cambio la imagen para que sea un parche de 9, rompe todo el diseño misteriosamente.Diseño de Android roto con fondo de 9 parches

La disposición anterior es el siguiente:

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

Cuando cambiado a 9-patch:

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

El archivo XML se mantuvo igual, solo se modificaron los archivos PNG.

<?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> 

¿Alguna idea? ¿U otras soluciones para obtener un fondo centrado y sin escala?

+8

Podría volver a subir las imágenes aquí como imágenes en línea? Actualmente faltan en su sitio, lo que hace que esta pregunta sea menos legible. –

+0

Oh, lo siento, olvidé que estaban vinculados aquí. Trataré de ver si tengo copias de seguridad antiguas en casa, pero Creo que se han ido ... – onik

+0

Me salvaste el día. Esto fue muy difícil de depurar. GRACIAS !!! –

Respuesta

99

significa que sólo tiene que añadir el atributo

android:padding="0dip" 

a su etiqueta de diseño

<?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"> 

Actualización:

Android Docs tiene la explicación exacta:

"También puede definir una sección dibujable opcional de la imagen (de hecho, las líneas de relleno) dibujando una línea en las líneas derecha e inferior. Si un objeto View configura el NinePatch como su fondo y luego especifica el texto de la Vista, se estirará para que todo el texto encaje solo dentro del área designada por las líneas derecha e inferior (si están incluidas). Si las líneas de relleno no están incluidas, Android usa las líneas izquierda y superior para definir esta área dibujable. "

ignorar este comportamiento por defecto tenemos que establecer el relleno atributo explícitamente en el diseño XML

+0

Gracias :) Pero ¿sabes por qué funciona? O lo que es el error? –

+2

http://developer.android.com/guide/developing/tools/draw9patch.html lados derecho e inferior definen el relleno dentro de la imagen de 9 parches. Debe establecer estos rellenos en la imagen de 9 parches o explícitamente en el diseño xml – vokilam

+0

@VokilaM, me gustaría saber dónde se menciona la información valiosa anterior en los documentos de Android. Tu solución también solucionó mi problema. – JRC

3

Resuelto el problema, mi área de relleno en el parche 9 no era adecuada. Cuando dibujé el área de relleno como el inverso del área estirable, la imagen comenzó a funcionar. Sólo pensé que esto habría sido automática si no hay área de relleno estaba presente :)

+0

Puede que quieras elegir la respuesta anterior - Tuve el mismo problema que describiste y estableciste ting padding a 0 resolvió el problema – Bostone

+0

Pensé lo mismo ... qué pérdida de tiempo ... funcionó ... gracias a VokilaM – user606669

0

Uso 9-parche de establecer la línea de contenidos (derecha y abajo)!

Cuestiones relacionadas