2010-09-28 5 views
21

Ich habe eine ViewFlipper-Implementierung, die verbessert werden muss. Dieser ViewFlipper hat drei untergeordnete Ansichten. Grundsätzlich möchte ich einen Indikator, auf dem die Kinderansicht gerade aktiv ist. Mein ViewFlipper ist nur ein Teil eines komplexen Layouts, das auch Listenansichten usw. enthält.Listener für ViewFlipper Widget spiegeln Ereignisse

Das Umschalten der Ansichten erfolgt ebenfalls automatisch und in einem bestimmten Intervall.

Von der SDK-Referenz von Android habe ich keinen Listener gesehen, wenn der ViewFlipper die untergeordnete Ansicht ändert.

Wissen Sie, wie ich einen Zuhörer für dieses Ereignis haben kann?

Oder gibt es alternative Möglichkeiten, diese Funktion neben der Verwendung von ViewFlipper zu implementieren?

Danke!

Antwort

36

Wenn Sie eine Animation (aus oder in der Animation) beim Umschalten der Ansicht anwenden, können Sie den Listener auf eine Animation einstellen und beispielsweise auf das Animationsende reagieren.

+2

+1 Dank! Das hat es genagelt. Ich verwendete xml-basierte Animationsparameter, also habe ich das komplett vermisst. Also habe ich jetzt die ViewFlipper-Animationsparameter in meiner Aktivität erstellt, anstatt sie in meiner XML-Datei zu haben. –

+0

im Allgemeinen finde ich es am bequemsten, mehr in Code als in xml zu setzen – slinden77

+0

Es funktioniert nur, wenn Sie eine Animation an erster Stelle wollen (und haben) :) Sonst ist es null –

-1

Während dies eine alte Frage ist, fand ich einen anständigen Ansatz, der funktioniert.

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); 
    } 


} 

dann die ViewFlipper verwenden Sie rufen showNext() oder showPrevious überall und kann die aktuell aktive Ansicht erhalten, indem getCurrentView() aufrufen. Dies hilft beim Einstellen verschiedener Animationen für Links und Rechts spiegeln und um aktuelle Arbeitsansichten zu erhalten.

0

finde ich einen Weg zu erkennen, welches Kind actived ist:

addOnLayoutChangeListener zu ViewFlipper und getCurrentView von ViewFlipper, dann mit Kindern von ViewFlipper vergleichen.

erinnern, wenn Aktivität removeOnLayoutChangeListener 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); 

}