2010-10-11 2 views
35

Я столкнулся с этой проблемой при обновлении фона, чтобы использовать изображение с 9 патчами. Макет отлично подходит для разных экранов с использованием разных размеров одного и того же изображения, но когда я меняю изображение на 9-патч, он таинственным образом разбивает весь макет.Разметка Android сломана с фоном с 9 патчами

предыдущий макет выглядит следующим образом:

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

При изменении 9-заплатки:

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

Файл XML остался прежним, только файлы 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> 

Любые идеи? Или другие решения для получения немасштабированного, центрированного фона?

+8

Не могли бы вы повторно загружать изображения здесь как inline-изображения? В настоящее время они отсутствуют на вашем сайте, что делает этот вопрос немного менее удобочитаемым. –

+0

О, извините, я забыл, что они были связаны здесь. Я попытаюсь посмотреть, есть ли у меня старые резервные копии дома, но я думаю, что они ушли ... – onik

+0

Вы спасли мой день. Это было очень сложно отладить. СПАСИБО !!! –

ответ

99

это означает просто добавить атрибуту

android:padding="0dip" 

в макет тега

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

Update:

Android Docs имеет точные пояснения:

«Вы также можете определить необязательный растягиваемый участок изображения (фактически, линии заполнения) путем рисования линии на правой и нижней линиях. Если объект «Вид» устанавливает NinePatch в качестве фона, а затем указывает текст «Вид», он будет растягиваться так, чтобы весь текст входил только в область, обозначенную правой и нижней строками (если она включена). Если строки прокладки не включены, Android использует левую и верхнюю строки, чтобы определить эту область для рисования. "

Чтобы игнорировать это поведение по умолчанию, мы должны установить атрибут набивки явно в макете XML

+0

Спасибо :) Но знаете ли вы, почему это работает? Или что это за ошибка? –

+2

http://developer.android.com/guide/developing/tools/draw9patch.html правая и нижняя стороны определяют прописку внутри изображения с 9 патчами. Вы должны установить эти paddings либо в 9-патч-изображении, либо явно в xml-макете – vokilam

+0

@VokilaM, я хотел бы знать, где выше ценная информация упоминается в документах Android. Ваше решение также устранило мою проблему. – JRC

3

Устранена проблема, моя область заполнения на 9-патче не подходит. Когда я нарисовал область прокладки как обратную к растяжимой области, изображение начало работать. Я просто подумал, что это было бы автоматически, если ни одна область набивка не присутствовал :)

+0

Вы можете выбрать ответ выше - у меня была та же проблема, которую вы описали и установили ting padding to 0 решил проблему – Bostone

+0

Я думал то же самое .. какая пустая трата времени .. работал .. благодаря VokilaM – user606669

0

Использование 9-патчи линия контента (справа и внизу)!