Я не могу заставить свои элементы, например ListView
, изменить размер должным образом.
У меня есть ListActivity
для поиска с помощью панели управления, поля редактирования и просмотра списка. Идея состоит в том, чтобы скрыть панель действий, пока отображается клавиатура.
Я расширил LinearLayout
, чтобы прислушиваться к изменениям размера просмотра (как рекомендовано здесь ):
public class SizeChangingLinearLayout extends LinearLayout {
//...
@Override
protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld)
{
View actionbar = mainView.findViewById(R.id.actionbar);
if (yNew > yOld)
actionbar.setVisibility(View.VISIBLE);
else if (yNew < yOld)
actionbar.setVisibility(View.GONE);
super.onSizeChanged(xNew, yNew, xOld, yOld);
}
}
Скрытие / отображение панели действий работает, как ожидалось, но под ListView
есть пробел той же высоты, что и скрытая панель действий. Как только изменяется какая-либо графика (например, запись в поле редактирования), ListView
заполняет пробел. Аналогичное поведение проявляется в обратном порядке при скрытии клавиатуры.
[Edit]
Та же проблема возникает и при изменении другого макета. Изменение видимости
вещей в onSizeChanged
отображается напрямую, но изменение размеров и полей не отображается, пока какое-либо другое действие пользователя не перерисовывает эти представления. Недействительность не работает из onSizeChanged
.
[/ Edit]
Я попытался обновить графику, выполнив:
invalidate
- используя оба пользовательских
LinearLayout и ListView
(в виде
рекомендуется здесь ) notifyDataSetChanged
в списке
адаптер forceLayout
... и другие безуспешно. Почему ListView
не меняет размер сначала? Должен ли я переопределить onLayout
в моем расширенном LinearLayout? Что я пропустил?
Вы можете заставить ListView перерисовать, изменив его высоту на 1px и вызвав
requestLayout()