我是
Android开发的菜鸟,我遇到了使视图无效的问题.我正在使用
this教程并没有实现它的问题.但是,当我更改视图的背景时,它仍然会响应,就像之前的背景仍然设置一样.换句话说,我更改了蒙版,但我的“touchview”类没有看到新的蒙版.我没有运气使用invalidate更新视图,我已经验证掩码实际上被重置为背景.任何帮助将不胜感激.
我的代码
@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; }
解决方法
我可以想到两种可能性:
选项1:您正在从非UI线程运行代码.在这种情况下,使用postInvalidate()而不是invalidate()
postInvalidate(): Cause an invalidate to happen on a subsequent cycle
through the event loop. Use this to invalidate the View from a non-UI
thread.
选项2:您正在从UI线程运行代码.在这种情况下,我需要您发布更多代码.请记住,invalidate()是异步的,因为它只调度主线程事件队列中的重绘.这意味着仅当当前代码全部执行时才会执行重绘.
在这种情况下,如果某些内容阻止了您的UI-Thread,您可以使用AsyncTask或Runnable来执行您的任务.