Слушатель событий переворота виджета ViewFlipper - PullRequest
25 голосов
/ 28 сентября 2010

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

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

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

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

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

Спасибо!

Ответы [ 5 ]

39 голосов
/ 28 сентября 2010

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

   viewFlipper.getInAnimation().setAnimationListener(new Animation.AnimationListener() {
      public void onAnimationStart(Animation animation) {}
      public void onAnimationRepeat(Animation animation) {}
      public void onAnimationEnd(Animation animation) {}
   });
1 голос
/ 05 ноября 2015

Я нашел один способ определить, какой ребенок активен:

addOnLayoutChangeListener для ViewFlipper и getCurrentView для ViewFlipper, а затем сравните с потомками ViewFlipper.

не забудьте удалить OnLayoutChangeListener при активности 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);

}
0 голосов
/ 26 ноября 2018

Я знаю, что на этот вопрос уже есть ответ.Но вот альтернатива, которая представляет собой метод ViewFlipper, унаследованный от ViewGroup и который, кажется, является лучшим из моего опыта.

Фрагменты кода ниже:

ViewFlipper viewFlipper = findViewById (R.id.myViewFlipperId);
viewFlipper.setOnHierarchyChangeListener(ViewGroup.OnHierarchyChangeListener);

Метод onChildViewAdded(View, View) в прослушивателе обратного вызова будет вызываться всякий раз, когда дочернее представление добавляется в ViewGroup.Который вы можете использовать для обнаружения, когда ViewFlipper переворачивается.

См. ViewGroup.html # setOnHierarchyChangeListener API Документы

0 голосов
/ 19 августа 2016

Я создал расширенный ViewFlipper, который делает именно это: DecentViewFlipper

0 голосов
/ 11 августа 2014

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

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 (). Это помогает устанавливать различные анимации для левого и правого перелистывания и легко получать текущие рабочие представления.

...