Странное поведение

Интерфейс, диалоги, темы, стили, меню
Ответить
Tamachi
Сообщения: 203
Зарегистрирован: 17 апр 2013, 00:08

Странное поведение

Сообщение Tamachi » 28 авг 2013, 19:33

Использую SimpleAdapter.
Вот layout шаблона элемента:

Код: Выделить всё

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="horizontal"
              android:layout_width="match_parent"
              android:layout_height="66dp"
              android:background="#fe2345"
              android:baselineAligned="true"
    android:gravity="top">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:id="@+id/param_name"
        android:layout_weight="0.34"
        android:background="@drawable/triangle_transparent"
        android:width="88dp"
        android:minWidth="88dp"
        android:maxWidth="88dp"

        android:textStyle="bold"
        android:typeface="normal"
        android:labelFor="@+id/param_value"
        android:textAlignment="textStart"
        android:singleLine="true"
        android:text="name"
        android:gravity="center_vertical|left"
        android:paddingStart="22dp" />

    <TextView
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:id="@+id/param_value"
            android:layout_weight="0.56"
            android:editable="false"
        android:clickable="false"
            android:focusable="false"
            android:focusableInTouchMode="false"
            android:enabled="true"
            android:singleLine="true"
            android:phoneNumber="false"
            android:selectAllOnFocus="false"
            android:inputType="text"
        android:textIsSelectable="false"
        android:textSize="22sp"
        android:text="value"
        android:gravity="clip_vertical|left"
        android:layout_gravity="top"
        android:typeface="normal"
        android:visibility="visible"
        android:paddingTop="4dp"
        android:paddingLeft="4dp"
        android:paddingBottom="4dp"
        android:paddingRight="4dp"
        android:autoText="true"
        android:background="@drawable/test"
        android:layout_marginBottom="12dp"
        android:layout_marginTop="12dp"
        android:textStyle="bold"
        android:layout_marginRight="4dp"
        android:layout_marginLeft="4dp" />
</LinearLayout>
Обратите внимание на следующие свойства кнопки:
android:width="88dp"
android:minWidth="88dp"
android:maxWidth="88dp"
Длина кнопки теоретически должна быть 88dp

Теоретически должно, а на практике в каждой строке описываемого Listview кнопка имеет свою длину. Длины всех кнопок разные!!!

Как такое объяснить?
Как сделать одинаковыми длины?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Странное поведение

Сообщение rezak90 » 28 авг 2013, 20:00

всё у тебя не так... читай сначала документацию перед тем как удивляться почему не работает
android:minWidth и android:maxWidth, а так же android:width это для установки размеров ШРИФТА, а не размера кнопки.
что бы ширина всех кнопок была одинаковой то тебе нужно установить android:layout_width="88dp"
R.id.team
Политика на форуме запрещена

Tamachi
Сообщения: 203
Зарегистрирован: 17 апр 2013, 00:08

Re: Странное поведение

Сообщение Tamachi » 29 авг 2013, 12:18

Еще вопрос:
между элементами списка видны горизонтальные линии -- разделители.
Их вид задается с помощью свойств divider и deviderHeight.

Разделители присутствуют _между_ записями, но отсутствуют _над_первой_ и _под_последней_ записями.

А как сделать чтобы разделители были везде?
Или наоборот -- чтобы их вообще не было.

Удивило то, что если сказать m_listView.addFooterView (добавить футер), то все разделители исчезают кроме _верхнего_.
(то есть, меняю футер, а изменения происходят в хидере!!!)

Пробовал просто графику снизу и сверху прикручивать, -- тоже не помогло.

Подскажите, есть какой-нибудь надёжный способ управления разделителями?

Уже голову сломал над этой темой!!!

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Странное поведение

Сообщение rezak90 » 29 авг 2013, 12:47

что бы удалить разделители нужно кинуть ему null:

Код: Выделить всё

android:divider="@null"
что бы поставить разделители:

Код: Выделить всё

android:divider="@drawable/my_divider"
но как ты правильно заметил то сверху и снизу их не будет, и здесь два выхода:
1) удалить все divider (кинуть ему null), и добавить линию в каждый view лейаут;
2) установить divider, но в главный лейаут добавить ручками линию сверху и снизу самого ListView;
R.id.team
Политика на форуме запрещена

Tamachi
Сообщения: 203
Зарегистрирован: 17 апр 2013, 00:08

Re: Странное поведение

Сообщение Tamachi » 29 авг 2013, 13:04

rezak90 писал(а):что бы удалить разделители нужно кинуть ему null:

Код: Выделить всё

android:divider="@null"
что бы поставить разделители:

Код: Выделить всё

android:divider="@drawable/my_divider"
но как ты правильно заметил то сверху и снизу их не будет, и здесь два выхода:
1) удалить все divider (кинуть ему null), и добавить линию в каждый view лейаут;
2) установить divider, но в главный лейаут добавить ручками линию сверху и снизу самого ListView;
Оба варианта уже много раз прорабатывал. Все равно невыходит!

1) Во-первых, удалить все divider не получается. Всегда есть divider по умолчанию. Как от него избавиться -- непонятно. Во-вторых, в каждом лейауте надо будет рисовать две линии (сверху и снизу), но тогда средние разделители будут отличаться по ширине от верхнего и нижнего. А надо чтобы они были одинаковыми.

2) Добавить ручками линии сверху и снизу тоже не получилось из-за особенностей gravity. Если я под ListView кладу ImageView и ставлю ему gravity=top и layout_gravity=top, то ImageView всё равно не хочет быть ровно под ListView. Он либо произвольно перескакивает в позицию "НАД ListView", либо выравнивается по границе фрейма, а не по границе ListView. (То есть между ListView и ImageView оказывается туева куча пространства!!!)

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Странное поведение

Сообщение rezak90 » 29 авг 2013, 18:28

Tamachi писал(а):1) Во-первых, удалить все divider не получается. Всегда есть divider по умолчанию. Как от него избавиться -- непонятно. Во-вторых, в каждом лейауте надо будет рисовать две линии (сверху и снизу), но тогда средние разделители будут отличаться по ширине от верхнего и нижнего. А надо чтобы они были одинаковыми.
Удалить все дивайдеры прекрасно получается, смотри может что не так делаешь. На всякий случай можешь ещё попробовать подсунуть пустой "дивайдер", в фотошопе берёшь рисунок 2х2 с пустым слоем и прогоняешь его через nine-path и кидаешь в качестве дивайдера. На счёт линий - рисовать нужно будет одну а не две, например сверху.
Tamachi писал(а):2) Добавить ручками линии сверху и снизу тоже не получилось из-за особенностей gravity. Если я под ListView кладу ImageView и ставлю ему gravity=top и layout_gravity=top, то ImageView всё равно не хочет быть ровно под ListView. Он либо произвольно перескакивает в позицию "НАД ListView", либо выравнивается по границе фрейма, а не по границе ListView. (То есть между ListView и ImageView оказывается туева куча пространства!!!)
Если через LinearLayout не получается то используй RelativeLayout, хотя не пойму что там трудного добавить линию сверху LinearLayout.
R.id.team
Политика на форуме запрещена

Tamachi
Сообщения: 203
Зарегистрирован: 17 апр 2013, 00:08

Re: Странное поведение

Сообщение Tamachi » 30 авг 2013, 07:06

rezak90 писал(а):
Tamachi писал(а):1) Во-первых, удалить все divider не получается. Всегда есть divider по умолчанию. Как от него избавиться -- непонятно. Во-вторых, в каждом лейауте надо будет рисовать две линии (сверху и снизу), но тогда средние разделители будут отличаться по ширине от верхнего и нижнего. А надо чтобы они были одинаковыми.
Удалить все дивайдеры прекрасно получается, смотри может что не так делаешь. На всякий случай можешь ещё попробовать подсунуть пустой "дивайдер", в фотошопе берёшь рисунок 2х2 с пустым слоем и прогоняешь его через nine-path и кидаешь в качестве дивайдера. На счёт линий - рисовать нужно будет одну а не две, например сверху.
Tamachi писал(а):2) Добавить ручками линии сверху и снизу тоже не получилось из-за особенностей gravity. Если я под ListView кладу ImageView и ставлю ему gravity=top и layout_gravity=top, то ImageView всё равно не хочет быть ровно под ListView. Он либо произвольно перескакивает в позицию "НАД ListView", либо выравнивается по границе фрейма, а не по границе ListView. (То есть между ListView и ImageView оказывается туева куча пространства!!!)
Если через LinearLayout не получается то используй RelativeLayout, хотя не пойму что там трудного добавить линию сверху LinearLayout.
Я быюсь над этой задачей уже 4 дня и три ночи! И складывается впечатление, что средствами андроид это вообще невозможно сделать. Все что расположено рядом с ListView ведёт себя вообще непредсказуемо. Видимо ListView во время перерисовки закрывает соседей и тонкие линии то исчезают вовсе, то множатся, то вдруг теряют выравнивание...

Если знаешь как, то покажи, пожалуйста.

Вот у меня в лейауте лежит так:

Лейаут1(неважно какой)
ListView
Лейаут2(неважно какой)

Лейаут1 и Лейаут2 имеют одинаковую высоту в 20dp
Если у Лейаут2 прописать layout_gravity=top, то он рисуется поверх Лейаут1, частично с ним пересекаясь c ним.

Если у Лейаут2 прописать layout_gravity=bottom, то он прилепляется к самому низу экрана, так что между ListView и Лейаут2 аш полэкрана!

А мне надо, чтобы Лейаут2 начинался ровнехонько там, где кончается ListView!!!

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Странное поведение

Сообщение rezak90 » 30 авг 2013, 12:28

Tamachi писал(а): Вот у меня в лейауте лежит так:

Лейаут1(неважно какой)
ListView
Лейаут2(неважно какой)

Лейаут1 и Лейаут2 имеют одинаковую высоту в 20dp
Если у Лейаут2 прописать layout_gravity=top, то он рисуется поверх Лейаут1, частично с ним пересекаясь c ним.

Если у Лейаут2 прописать layout_gravity=bottom, то он прилепляется к самому низу экрана, так что между ListView и Лейаут2 аш полэкрана!

А мне надо, чтобы Лейаут2 начинался ровнехонько там, где кончается ListView!!!
ты наверное не правильно понимаешь как работать с layout_gravity=top и layout_gravity=bottom ... в товём случае нужно использовать RelativeLayout. Сегодня нашкрябую лейаут и покажу
R.id.team
Политика на форуме запрещена

Tamachi
Сообщения: 203
Зарегистрирован: 17 апр 2013, 00:08

Re: Странное поведение

Сообщение Tamachi » 30 авг 2013, 13:31

rezak90 писал(а):
Tamachi писал(а): Вот у меня в лейауте лежит так:

Лейаут1(неважно какой)
ListView
Лейаут2(неважно какой)

Лейаут1 и Лейаут2 имеют одинаковую высоту в 20dp
Если у Лейаут2 прописать layout_gravity=top, то он рисуется поверх Лейаут1, частично с ним пересекаясь c ним.

Если у Лейаут2 прописать layout_gravity=bottom, то он прилепляется к самому низу экрана, так что между ListView и Лейаут2 аш полэкрана!

А мне надо, чтобы Лейаут2 начинался ровнехонько там, где кончается ListView!!!
ты наверное не правильно понимаешь как работать с layout_gravity=top и layout_gravity=bottom ... в товём случае нужно использовать RelativeLayout. Сегодня нашкрябую лейаут и покажу
C RelativeLayout получилось. Спасибо!

Но теперь возникла проблема с поворотом экрана. При этом раньше (с другими лейаутами) этой проблемы не наблюдалось. Проблема выглядит так:
Activity1 с помощью startAcrivityForResult вызывает Activity2, в котором есть поль ввода.
Заполнив поле ввода, пользователь жмет кнопку "ГОТОВО" и возвращает результат обратно в Activity1.
Пока всё работает.

НО, вот последовательноivityсть действий, однозначно приводящая к исключению:
1. Из Activity1 вызвать Activity2
2. Заполнить поле ввода
3 . Изменить ориентацию экрана!!!!!!
4. Нажать на кнопку "ГОТОВО"
5. Увидеть NULL-Pointer-Exception!!!

Ошибка стала наблюдаться после смены лейаута на RelativeLayout.

Совпадение или глюк системы?

Tamachi
Сообщения: 203
Зарегистрирован: 17 апр 2013, 00:08

Re: Странное поведение

Сообщение Tamachi » 30 авг 2013, 15:22

С проблемой ориентации экрана справился самостоятельно

Ответить