2013-05-07 16 views
7

Android geliştirme için bir noob var ve bir görünümü geçersiz kılan sorun yaşıyorum. this eğitimini kullanıyorum ve uygulayan hiçbir sorunum yok. Ancak, görünümün arka planını değiştirdiğimde, hala önceki arka plan ayarlanmış gibi yanıt verir. Başka bir deyişle, maskeyi değiştirdim ama "touchview" sınıfım yeni maskeyi görmüyor. Görünümü güncelleştirmek için geçersizlik kullanma şansım olmadı ve maskenin aslında arka plan olarak sıfırlandığını doğruladım. Herhangi bir yardım büyük takdir edilecektir.Özel Görünüm Neden Geçersiz Olmuyor?

MY KOD

@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

Neden durum bildirisinde R.id.itemId'yi kullanmıyorsunuz? Daha basittir. Kodunuzun çalıştırıldığından emin misiniz? ve bağlantı kırıldı, lütfen kodunuzu buraya gönderin. – VinceStyling

+0

Action Bar Sherlock, int ids ile menü öğeleri oluşturmamı sağlıyor. Yukarıdaki bağlantı ve kod çalıştırılır. –

cevap

22

İki olasılık içinde düşünebiliriz:

1. Seçenek: olmayan bir UI iş parçacığı verdiği kodu yayınlanıyor. Bu durumda, yerine geçersiz()

postInvalidate() ait) postInvalidate (kullanın: Bir invalidate olay döngü içinde bir sonraki döngü üzerinde gerçekleşmesi Nedeni. UI olmayan bir iş parçacığı görünümü geçersiz kılmak için bunu kullanın.

Seçenek 2: Sen UI iş parçacığı verdiği kodu yayınlanıyor. Bu durumda, daha fazla kod göndermenizi istiyorum. Yalnızca ana iş parçacığı olay sırasındaki bir yeniden çizmeyi planladığı için invalidate()'un zaman uyumsuz olduğunu unutmayın. Bu, yeniden çizmenin yalnızca mevcut kodun tamamı yürütüldüğünde gerçekleştirileceği anlamına gelir.

Bu durumda, bir şey UI-Thread'inizi engelliyorsa, görevinizi gerçekleştirmek için AsyncTask veya Runnable'ı kullanabilirsiniz.