2013-05-07 20 views
7

Im un noob per lo sviluppo Android e sto avendo problemi invalidando una vista. Sto usando il tutorial this e non ho problemi a implementarlo. Tuttavia, quando cambio lo sfondo della vista, risponde comunque come se lo sfondo precedente fosse ancora impostato. In altre parole, cambio la maschera ma la mia classe "touchview" non vede la nuova maschera. Non ho avuto fortuna ad usare invalidate per aggiornare la vista e ho verificato che la maschera sia effettivamente resettata come sfondo. Qualsiasi aiuto sarebbe molto apprezzato.Perché la vista personalizzata non è stata invalidata?

MIO CODICE

@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

Perché non usi R.id.itemId all'istruzione case, è più semplice. Sei sicuro che il tuo codice sia stato invocato? e il collegamento è rotto, per favore pubblica qui il tuo codice. – VinceStyling

+0

Action Bar Sherlock mi consente di creare voci di menu con int ids. Il link sopra funziona e il codice è invocato. –

risposta

22

posso pensare a due possibilità:

Opzione 1: Si esegue il codice da un thread non-UI. In questo caso, utilizzare postInvalidate() anziché invalidate()

postInvalidate(): Causa un invalidate avvenga in un successivo ciclo di attraverso il ciclo degli eventi. Utilizzare questo per invalidare la vista da una thread non UI .

Opzione 2: si esegue il codice dal thread dell'interfaccia utente. In questo caso, avrei bisogno che tu inserissi più codice. Ricordare che invalidate() è asincrono, in quanto pianifica solo un ridisegno nella coda eventi thread principale. Ciò significa che il ridisegno verrà eseguito solo quando il codice corrente è stato eseguito.

In questo caso, se qualcosa sta bloccando il thread UI, è possibile utilizzare AsyncTask o Runnable per eseguire l'attività.