为什么自定义视图不会失效?

我是一个noob android开发,我有问题使视图无效。 我正在使用本教程,并没有实现它的问题。 但是,当我改变视图的背景时,它仍然响应,就好像前一个背景仍然被设置。 换句话说,我改变了面具,但我的“touchview”类没有看到新的面具。 我没有运气使用invalidate来更新视图,我已经validation了mask实际上被重置为背景。 任何帮助将不胜感激。

我的代码

@Override public boolean onMenuItemClick(com.actionbarsherlock.view.MenuItem item) { // TODO Auto-generated method stub switch (item.getItemId()) { case 1: // id from the xml file if(isMale){ isMale=false; item.setIcon(R.drawable.male_icon); imageViewOriginal.setImageResource(R.drawable.woman_front); imageViewFlip.setImageResource(R.drawable.woman_back); if(isFrontView){ myMask.setBackgroundResource(R.drawable.woman_front_mask); //Mask changed here }else{ myMask.setBackgroundResource(R.drawable.woman_back_mask); //Mask changed here } }else{ isMale=true; item.setIcon(R.drawable.female_icon); imageViewOriginal.setImageResource(R.drawable.man_front); imageViewFlip.setImageResource(R.drawable.man_back); if(isFrontView){ myMask.setBackgroundResource(R.drawable.man_front_mask); //Mask changed here }else{ myMask.setBackgroundResource(R.drawable.man_back_mask); //Mask changed here } } touchView.invalidate(); infoView.invalidate(); myMask.invalidate(); //Mask View Invalidated here return true; // we handled the click, dont pass it up the chain case 2: // id from the xml file if(isFrontView){ isFrontView=false; if(isMale){ myMask.setBackgroundResource(R.drawable.man_back_mask); //Mask changed here }else{ myMask.setBackgroundResource(R.drawable.woman_back_mask); //Mask changed here } }else{ isFrontView=true; if(isMale){ myMask.setBackgroundResource(R.drawable.man_front_mask); //Mask changed here }else{ myMask.setBackgroundResource(R.drawable.woman_front_mask); //Mask changed here } } FlipAnimator animator = new FlipAnimator(imageViewOriginal, imageViewFlip, imageViewFlip.getWidth() / 2, imageViewFlip.getHeight() / 2); if (imageViewOriginal.getVisibility() == View.GONE) { animator.reverse(); } flipLayout.startAnimation(animator); touchView.invalidate(); infoView.invalidate(); myMask.invalidate(); //Mask View Invalidated here return true; } return false; } 

Solutions Collecting From Web of "为什么自定义视图不会失效?"

我可以想两种可能性:

选项1:您正在从非UI线程运行您的代码。 在这种情况下,使用postInvalidate()而不是invalidate()

postInvalidate():导致在事件循环的后续循环中发生无效。 使用这个来使非UI线程的View失效。

选项2:您正在从UI线程运行您的代码。 在这种情况下,我需要你发布更多的代码。 请记住, invalidate()是asynchronous的,因为它只调度主线程事件队列中的重绘。 这意味着只有在当前代码全部执行完成后才能执行重绘。

在这种情况下,如果有什么东西阻塞了你的UI线程,你可以使用AsyncTask或Runnable来执行你的任务。