2010-09-28 2 views
21

У меня есть реализация ViewFlipper, которую нужно улучшить. Этот ViewFlipper имеет три дочерних представления. В принципе, мне нужен индикатор, на котором в настоящее время активен дочерний вид. My ViewFlipper - это лишь часть сложной компоновки, которая также имеет виды списков и т. Д.Слушатель для событий виджетов виджета ViewFlipper

Переключение видов также выполняется автоматически и выполняется за определенный интервал.

Из ссылки SDK от Android я не видел ни одного слушателя, когда ViewFlipper меняет вид ребенка.

Вы, ребята, знаете, как я могу иметь слушателя для этого события?

Или есть альтернативные способы я могу реализовать эту функцию, кроме использования ViewFlipper?

Спасибо!

ответ

36

Если вы применяете анимацию (вне или в анимации) при переключении просмотра, вы можете настроить прослушиватель на анимацию и, например, действовать на конец анимации.

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

+1 Спасибо! Это прибило его. Я использовал параметры анимации на основе xml, поэтому я полностью пропустил это. Поэтому я теперь создал параметры анимации ViewFlipper внутри своей Activity вместо того, чтобы иметь его в моем xml. –

+0

В общем, мне наиболее удобно устанавливать больше кода, а затем в xml – slinden77

+0

Он работает только, если вы хотите (и имеете) анимацию в первую очередь :) В противном случае она равна нулю –

-1

Хотя это старый вопрос, я нашел достойный подход, который работает.

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


} 

Затем использовать ViewFlipper вы звоните showNext() или showPrevious в любом месте и может получить текущий активный вид по телефону getCurrentView(). Это помогает в настройке различных анимаций для левого и правого листания и для быстрого получения текущих рабочих просмотров.

0

Я нахожу один способ обнаружения которых ребенок Активизированный:

addOnLayoutChangeListener к ViewFlipper и getCurrentView из ViewFlipper, а затем сравнить с Чайлдс из ViewFlipper.

забудьте 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); 

} 
Смежные вопросы