Android: layout_alignParentBottom игнорируется при использовании без явной высоты раскладки в виде строки в ListView
Когда я использую RelativeLayout
с fill_parent
или wrap_content
как высоту и элемент, который указывает: android:layout_alignParentBottom="true"
, он игнорируется и выравнивается вверху. Установка высоты RelativeLayout
на явное значение заставляет ее работать. Любые подсказки?
Ответы
Ответ 1
Кажется, это ошибка в самом Android, см. http://code.google.com/p/android/issues/detail?id=1394.
Я работал над этим, обернув RelativeLayout
в FrameLayout
и установив нижнее выровненное представление как дочерние элементы FrameLayout
с android:layout_gravity="bottom"
. Это мешает вам ссылаться на него из RelativeLayout
, поэтому вам придется обойти это (например, используя поля).
Если у кого-то есть лучшее обходное решение, поделитесь им.
Ответ 2
Когда вы раздуваете макет, используйте inflate(R.layout.whatever, parent, false)
, где parent
- ListView
. Если вы этого не сделаете (например, вы передаете null
для родителя), RelativeLayout
становится странным в строках списка.
Ответ 3
Я смог получить правильное выравнивание, указав проблемный TextView с помощью:
android:id="@+id/must_be_bottom_left"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_below="@id/xxx"
где xxx
был идентификатором a TextView
, который имеет android:layout_below="@id/yyy"
и yyy
- это TextView
, который всегда выше и xxx
и must_be_bottom_left
.
Содержимое моих элементов списка может меняться так, чтобы иногда "xxx" TextView
был View.GONE
, но даже тогда макет работает как ожидалось.
Я не знаю, насколько хрупкой или просто сердепидной это обход. Я использую Android 1.6, и я не тестировал его для совместимости с Outlook.
Ответ 4
Мой взлом для этой ошибки andriod:
ViewGroup.LayoutParams lp=(ViewGroup.LayoutParams)view.getLayoutParams();
lp.height=view.getContentHeight();//hack for android bug about ViewGroup.LayoutParams.WRAP_CONTENT and android:layout_alignParentBottom="true" on landscape orientation
view.requestLayout();
act.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);