【问题标题】:Android Invalidate doesn't refresh the whole activityAndroid Invalidate 不会刷新整个活动
【发布时间】:2013-11-24 04:05:37
【问题描述】:

以下是我的活动中的组件:

  1. 列表视图
  2. 底栏实际上是列表视图下的RelativeLayout。它在我的程序中动态显示或隐藏。像这样的

代码

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

似乎 invalidate() 根本不起作用。如果我添加一些东西,我会设置底部栏的高度。视图根本没有刷新。只有在我滚动 ListView 后才会刷新。

有什么想法吗?谢谢

【问题讨论】:

  • 你是在主线程上运行这段代码吗?
  • 顺便说一句,如果我像这样在 invalidate() 之前添加一行:listadapter.notifyDataSetChanged(),它将起作用。但我不知道为什么?
  • 实际上 listadapter.notifyDataSetChanged() 只会刷新视图。 invalidate() 和 requestLayout() 不会。
  • 您能否再多展示一下这段代码的位置,以便更好地了解正在发生的事情?
  • @codeMagic - 整个应用程序相当复杂。但是上面提到的代码是在 onActivityResult() 内部调用的,它是从另一个活动返回的(在 onCreate 中也作为初始化调用)。另一个活动是通过单击列表视图中的单元格来启动的。

标签: android android-activity refresh invalidation


【解决方案1】:

你应该在改变相对布局的高度后调用requestLayout()而不是invalidate()

【讨论】:

    【解决方案2】:

    使整个视图无效。如果视图可见,onDraw(Canvas) 将在将来的某个时间点被调用。这必须从 UI 线程调用。要从非 UI 线程调用,请调用 postInvalidate()。

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

    现在,当 Activity 恢复时,它会让每个 View 都绘制自己。不需要调用 invalidate()。要应用主题,请确保在绘制任何视图之前执行此操作,即在setContentView(R.layout.mainscreen);

    【讨论】:

      猜你喜欢
      • 2015-03-15
      • 1970-01-01
      • 2018-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多