2013-11-24 3 views
3

Вот компоненты в моей деятельности:Android Invalidate не обновляет всю деятельность

  1. Список вид
  2. Bottom бар, который на самом деле RelativeLayout под видом списка. Он динамически отображается или скрывается в моей программе. Что-то вроде этого

кодекса

if (condition) {   
    bottombar.getLayoutParams().height = RelativeLayout.LayoutParams.WRAP_CONTENT;    
} else {   
    bottombar.getLayoutParams().height = 0; 
}   
this.findViewById(android.R.id.content).invalidate(); 

Кажется Invalidate() не работает. Если я что-то добавлю, я устанавливаю высоту нижней панели. Взгляд не обновляется вообще. Он будет обновлен только после прокрутки списка ListView.

Есть идеи? Спасибо

+0

Вы используете этот код в основной теме? – codeMagic

+0

Нет, в моей теме пользовательского интерфейса –

+0

Кстати, если я добавлю строку до invalidate() следующим образом: listadapter.notifyDataSetChanged(), она будет работать. Но я не знаю почему? –

ответ

0

Недействительный вид. Если вид видимый, onDraw (Canvas) будет вызываться в какой-то момент в будущем. Это должно вызываться из потока пользовательского интерфейса. Для вызова из потока, отличного от UI, вызовите postInvalidate().

ViewGroup vg = findViewById (R.id.mainLayout); 
vg.invalidate(); 

Теперь, когда активность возобновляется, она заставляет каждый вид рисовать себя. Не требуется вызов invalidate(). Чтобы применить тему, убедитесь, что вы сделали это до того, как какой-либо вид нарисован, т. Е. До setContentView(R.layout.mainscreen);

3

Вместо invalidate() вы должны позвонить по номеру requestLayout() после изменения высоты относительной компоновки.

Смежные вопросы