2010-09-28 19 views
21

Mam implementację ViewFlipper, która wymaga poprawy. Ten ViewFlipper ma trzy widoki podrzędne. Zasadniczo chcę wskaźnik, na którym widok podrzędny jest obecnie aktywny. My ViewFlipper jest tylko częścią złożonego układu, który ma również widoki listy, itp.Listener dla widgetu ViewFlipper odwracającego zdarzenia

Przełączanie widoków jest również automatyczne i wykonywane w określonych odstępach czasu.

Z referencji SDK Androida, nie widziałem żadnego słuchacza, gdy ViewFlipper zmienia widok podrzędny.

Czy znacie sposób, w jaki mogę mieć słuchacza do tego wydarzenia?

A może istnieją inne sposoby wdrożenia tej funkcji poza użyciem ViewFlipper?

Dzięki!

Odpowiedz

36

Jeśli zastosujesz animację (out lub w animacji) do przełączania widoku, możesz ustawić detektor na animację i, na przykład, działać na końcu animacji.

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

+1 Dzięki! To go przybiło. Używałem parametrów animacji opartych na XML, więc całkowicie to przegapiłem. Tak więc utworzyłem parametry animacji ViewFlipper wewnątrz mojej aktywności, zamiast mieć je w moim xml. –

+0

Ogólnie uważam, że najwygodniej jest ustawić więcej w kodzie niż w xml – slinden77

+0

Działa tylko jeśli chcesz (i masz) animację na pierwszym miejscu :) W przeciwnym razie jest ona zerowa –

-1

Chociaż jest to stare pytanie, znalazłem przyzwoite podejście, które działa.

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


} 

Następnie użyć ViewFlipper zadzwonić showNext() lub showPrevious wszędzie i można uzyskać aktualnie aktywnego widoku poprzez wywołanie getCurrentView(). Pomaga to w ustawieniu różnych animacji dla rzutowania z lewej i prawej strony oraz dla łatwego uzyskiwania aktualnych poglądów roboczych.

0

znajdę jeden sposób, aby wykryć, które dziecko jest actived:

addOnLayoutChangeListener do ViewFlipper i getCurrentView z ViewFlipper, a następnie porównać z Childs z ViewFlipper.

pamiętać removeOnLayoutChangeListener gdy aktywność 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); 

} 
Powiązane problemy