2010-09-28 2 views
21

ho un'implementazione ViewFlipper che deve essere migliorato. Questo ViewFlipper ha tre viste figlio. Fondamentalmente, voglio un indicatore su quale vista figlio è attualmente attiva. My ViewFlipper è solo una parte di un layout complesso che ha anche visualizzazioni elenco, ecc.Listener per Widget lanciando ViewFlipper eventi

Anche la commutazione delle viste è automatica e viene eseguita in un intervallo specificato.

Dal riferimento SDK di Android, non ho visto alcun listener per quando ViewFlipper cambia la visualizzazione figlio.

Siete a conoscenza di un modo in cui posso avere un ascoltatore per quell'evento?

Oppure esistono modi alternativi per implementare questa funzione oltre a utilizzare ViewFlipper?

Grazie!

risposta

36

Se si applica l'animazione (in uscita o in animazione) alla commutazione della vista, è possibile impostare l'ascoltatore su un'animazione e, ad esempio, agire sull'animazione.

viewFlipper.getInAnimation().setAnimationListener(new Animation.AnimationListener() { 
     public void onAnimationStart(Animation animation) {} 
     public void onAnimationRepeat(Animation animation) {} 
     public void onAnimationEnd(Animation animation) {} 
    }); 
+2

+1 Grazie! Questo l'ha inchiodato. Stavo usando i parametri di animazione basati su xml quindi mi sono totalmente perso. Così ora ho creato i parametri di animazione ViewFlipper all'interno della mia attività invece di averlo nel mio xml. –

+0

in generale trovo più comodo impostare più codice in xml – slinden77

+0

Funziona solo se si desidera (e si ha) un'animazione in primo luogo :) Altrimenti è nullo –

-1

Mentre questa è una vecchia domanda, ho trovato un approccio decente che funziona.

public class MainLaunch extends Activity { 

    ... main setup and code 

    int currentIndex = 0; 
    int maxIndex = 3; 

    // set specific animations for the view flipper on showNext 
    // only showNext while in valid index 
    public void showNext() { 
     if(currentIndex < maxIndex) 
     { 
      currentIndex++; 
      viewFlipper.setInAnimation(getBaseContext(), R.anim.slide_in_left); 
      viewFlipper.setOutAnimation(getBaseContext(), R.anim.slide_out_right); 
      viewFlipper.showNext(); 
     } 
    } 

    // set specific animations for the view flipper on showPrevious 
    // only showPrevious while in valid index 
    public void showPrevious() { 
     if(currentIndex > 0) 
     { 
      currentIndex--; 
      viewFlipper.setInAnimation(getBaseContext(), R.anim.slide_in_right); 
      viewFlipper.setOutAnimation(getBaseContext(), R.anim.slide_out_left); 
      viewFlipper.showPrevious(); 
     } 
    } 

    // get current flipped view 
    public View getCurrentView() { 
     return viewFlipper.getChildAt(currentIndex); 
    } 


} 

quindi di utilizzare il ViewFlipper si chiama showNext() o showPrevious ovunque e può ottenere la vista attualmente attiva chiamando getCurrentView(). Questo aiuta a impostare diverse animazioni per il ribaltamento sinistro e destro e per ottenere facilmente viste di lavoro correnti.

0

trovo un modo per rilevare quale bambino è actived:

addOnLayoutChangeListener a ViewFlipper, e getCurrentView di ViewFlipper, quindi confrontare con bambino di ViewFlipper.

ricordarsi di removeOnLayoutChangeListener quando l'attività onDestory

private View page1, page2, page3, page4; 
private ViewFlipper viewFlipper; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.flipper); 

    page1 = findViewById(R.id.MyFlipper_page01); 
    page2 = findViewById(R.id.MyFlipper_page02); 
    page3 = findViewById(R.id.MyFlipper_page03); 
    page4 = findViewById(R.id.MyFlipper_page04); 

    viewFlipper = (ViewFlipper) findViewById(R.id.MyFlipper_flipper); 

    viewFlipper.addOnLayoutChangeListener(onLayoutChangeListener_viewFlipper); 

} 

View.OnLayoutChangeListener onLayoutChangeListener_viewFlipper = new View.OnLayoutChangeListener() { 
    @Override 
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 

     if(viewFlipper.getCurrentView() == page1) 
      Log.d("test", "change to flipper_page1"); 
     else if(viewFlipper.getCurrentView() == page2) 
      Log.d("test", "change to flipper_page2"); 
     else if(viewFlipper.getCurrentView() == page3) 
      Log.d("test", "change to flipper_page3"); 
     else if(viewFlipper.getCurrentView() == page4) 
      Log.d("test", "change to flipper_page4"); 



    } 
}; 


@Override 
protected void onDestroy() { 
    super.onDestroy(); 

    viewFlipper.removeOnLayoutChangeListener(onLayoutChangeListener_viewFlipper); 

}