Android Линейный / RelativeLayout размеров с ImageViews - PullRequest
2 голосов
/ 30 августа 2010

Застрял в этом в течение нескольких дней, просто не работает с тем, как я это настраиваю. У меня есть большая сетка ImageViews, которые все одного размера. Он состоит из горизонтальной линейной планировки и 5 вертикальных линейных планировок (первое изображение).

То, что я хочу (и мне все равно, как, используя RelativeLayout, Linear или Tables), это если бы я должен был сказать, например, Изображение №2, для более крупного изображения (в частности, 3х3 из меньших), я хочу, чтобы оно было эффективно «перезаписать» эти изображения (как показано на рисунке 2).

Я попытался сделать это, установив перезаписанные изображения (3,4,7,8,9,12,13,14) в setVisibility (GONE), который работает нормально, но затем второй вертикальный LinearLayout расширился до соответствовать размеру нового изображения, которое я не хочу. Если я попытаюсь установить его в fill_parent, то он уменьшит размер изображения. В результате я получаю третью картинку.

Весь связанный XML-код (идентификаторы совпадают с кодами на изображении):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"> 
<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"> 
    <ImageView android:id="@+id/gs01"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
        />
    <ImageView android:id="@+id/gs06"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
        />
    <ImageView android:id="@+id/gs11"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
        />
    <ImageView android:id="@+id/gs16"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
        />
</LinearLayout>


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"> 
    <ImageView android:id="@+id/gs02"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
        />
    <ImageView android:id="@+id/gs07"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
        />
    <ImageView android:id="@+id/gs12"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
        />
    <ImageView android:id="@+id/gs17"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
        />
</LinearLayout>


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"> 
    <ImageView android:id="@+id/gs03"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
        />
    <ImageView android:id="@+id/gs08"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
        />
    <ImageView android:id="@+id/gs13"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
        />
    <ImageView android:id="@+id/gs18"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
        />
</LinearLayout>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"> 
    <ImageView android:id="@+id/gs04"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
        />
    <ImageView android:id="@+id/gs09"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
        />
    <ImageView android:id="@+id/gs14"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
        />
    <ImageView android:id="@+id/gs19"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
        />
</LinearLayout>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"> 
    <ImageView android:id="@+id/gs05"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
        />
    <ImageView android:id="@+id/gs10"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
        />
    <ImageView android:id="@+id/gs15"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
        />
    <ImageView android:id="@+id/gs20"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
        />
</LinearLayout>

</LinearLayout>

Если бы я делал это с помощью RelativeLayouts, у меня возникали проблемы при установке setVisibility (GONE), поскольку на позицию можно было бы ссылаться с помощью отсутствующего View. Установка его в INVISIBLE просто оставляет пустое место, когда я действительно хочу, чтобы он был размером 0px на 0px.

Буду признателен за любую помощь; кажется, что независимо от того, что я пробую, что-то всегда идет не так, как надо, и это сводит меня с ума.

alt text

Ответы [ 2 ]

2 голосов
/ 30 августа 2010

Наконец-то все заработало, используя RelativeLayout и якоря. Якоря имеют размер квадрата сетки 1x1, тогда у вас есть другой набор изображений AlignLeft и AlignTop в нужной позиции, например:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/relay"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"> 

    <ImageView android:id="@+id/a_t1"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|left"
        />
    <ImageView android:id="@+id/a_t2"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|left"
android:layout_toRightOf="@id/a_t1"
        />
    <ImageView android:id="@+id/a_t3"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|left"
android:layout_toRightOf="@id/a_t2"
        />
    <ImageView android:id="@+id/a_t4"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|left"
android:layout_toRightOf="@id/a_t3"
        />
    <ImageView android:id="@+id/a_t5"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|left"
android:layout_toRightOf="@id/a_t4"
        />


        <ImageView android:id="@+id/a_t6"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|left"
android:layout_below="@id/a_t1"
        />
    <ImageView android:id="@+id/a_t7"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|left"
android:layout_toRightOf="@id/a_t6"
android:layout_below="@id/a_t2"
        />
    <ImageView android:id="@+id/a_t8"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|left"
android:layout_toRightOf="@id/a_t7"
android:layout_below="@id/a_t3"
        />
    <ImageView android:id="@+id/a_t9"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|left"
android:layout_toRightOf="@id/a_t8"
android:layout_below="@id/a_t4"
        />
    <ImageView android:id="@+id/a_t10"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|left"
android:layout_toRightOf="@id/a_t9"
android:layout_below="@id/a_t5"
        />



        <ImageView android:id="@+id/a_t11"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|left"
android:layout_below="@id/a_t6"
        />
    <ImageView android:id="@+id/a_t12"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|left"
android:layout_toRightOf="@id/a_t11"
android:layout_below="@id/a_t7"
        />
    <ImageView android:id="@+id/a_t13"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|left"
android:layout_toRightOf="@id/a_t12"
android:layout_below="@id/a_t8"
        />
    <ImageView android:id="@+id/a_t14"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|left"
android:layout_toRightOf="@id/a_t13"
android:layout_below="@id/a_t9"
        />
    <ImageView android:id="@+id/a_t15"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|left"
android:layout_toRightOf="@id/a_t14"
android:layout_below="@id/a_t10"
        />



<ImageView android:id="@+id/a_t16"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|left"
android:layout_below="@id/a_t11"
        />
    <ImageView android:id="@+id/a_t17"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|left"
android:layout_toRightOf="@id/a_t16"
android:layout_below="@id/a_t12"
        />
    <ImageView android:id="@+id/a_t18"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|left"
android:layout_toRightOf="@id/a_t17"
android:layout_below="@id/a_t13"
        />
    <ImageView android:id="@+id/a_t19"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|left"
android:layout_toRightOf="@id/a_t18"
android:layout_below="@id/a_t14"
        />
    <ImageView android:id="@+id/a_t20"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|left"
android:layout_toRightOf="@id/a_t19"
android:layout_below="@id/a_t15"
        />

    <ImageView android:id="@+id/gs01"
        android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|left"
android:layout_alignLeft="@id/a_t1"
android:layout_alignTop="@id/a_t1"
        />

</RelativeLayout>

Так что, если вы хотите поместить что-то на # 2, как в моем примере, измените layout_alignLeft и layout_alignTop для идентификатора gs01 на @ id / a_t2, и это будет работать. Это позволяет обойти проблему с установкой setVisibility (GONE), которая удаляет «опорную» точку, используемую для вычисления положения пространств сетки.

Теперь это было сложно. = (

2 голосов
/ 30 августа 2010

Хм, я вернусь к этому, когда вернусь домой и попробую кое-что, но я бы рекомендовал попробовать TableLayout с 5 строками и 5 столбцами.Вы должны иметь возможность установить диапазон строк и столбцов в коде (чтобы представление занимало более одной ячейки).Это то, что я бы попробовал в первую очередь.

Этот пост выглядит полезным.

...