2013-05-07 20 views
7

Jestem noobem dla Androida i mam problemy z unieważnieniem widoku. Korzystam z samouczka this i nie mam problemów z jego implementacją. Jednak po zmianie tła widoku nadal odpowiada, tak jakby poprzednie tło było nadal ustawione. Innymi słowy, zmieniam maskę, ale moja klasa "touchview" nie widzi nowej maski. Nie miałem szczęścia przy użyciu invalidate, aby zaktualizować widok, a ja zweryfikowałem, że maska ​​jest resetowana jako tło. Każda pomoc będzie bardzo ceniona.Dlaczego widok niestandardowy nie unieważnia?

mój 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

Dlaczego nie używasz R.id.itemId w przypadku oświadczenia, To jest bardziej proste. Czy na pewno jesteś pewien, że twój kod jest wywoływany? a link jest zepsuty, proszę zaksięguj tutaj swój kod. – VinceStyling

+0

Pasek akcji Sherlock pozwala mi tworzyć elementy menu z numerami wewnętrznymi. Powyższy link działa, a kod jest wywoływany. –

Odpowiedz

22

mogę myśleć w dwóch możliwości:

Wariant 1: Używasz kod z wątku non-UI. W tym przypadku należy użyć postInvalidate() zamiast unieważniania()

postInvalidate(): spowodować invalidate się zdarzyć na kolejnym cyklu przez pętlę zdarzeń. Użyj tego, aby unieważnić widok z wątku innego niż UI .

Opcja 2: Uruchamiasz swój kod z wątku interfejsu użytkownika. W takim przypadku potrzebowałbym, aby opublikować więcej kodu. Pamiętaj, że invalidate() jest asynchroniczny, ponieważ planuje odświeżenie tylko w głównej kolejce zdarzeń wątku. Oznacza to, że odświeżenie zostanie wykonane tylko po wykonaniu bieżącego kodu.

W takim przypadku, jeśli coś blokuje twój wątek interfejsu użytkownika, możesz użyć AsyncTask lub Runnable, aby wykonać swoje zadanie.

Powiązane problemy