Слушатель для просмотра виджета ViewFlipper
У меня есть реализация ViewFlipper, которую нужно улучшить. Этот ViewFlipper имеет три дочерних представления. В принципе, мне нужен индикатор, на котором в настоящее время активен дочерний вид. My ViewFlipper - это всего лишь часть сложного макета, который также имеет виды списков и т.д.
Переключение представлений также выполняется автоматически и выполняется за определенный интервал.
Из справки Android SDK я не видел ни одного слушателя, когда ViewFlipper меняет дочерний вид.
Вы, ребята, знаете, каким образом у меня может быть слушатель для этого события?
Или есть альтернативные способы реализовать эту функцию, кроме использования ViewFlipper?
Спасибо!
Ответы
Ответ 1
Если вы применяете анимацию (вне или в анимации) при переключении просмотра, вы можете настроить прослушиватель на анимацию и, например, действовать на конец анимации.
viewFlipper.getInAnimation().setAnimationListener(new Animation.AnimationListener() {
public void onAnimationStart(Animation animation) {}
public void onAnimationRepeat(Animation animation) {}
public void onAnimationEnd(Animation animation) {}
});
Ответ 2
Я нашел один способ определить, какой ребенок активирован:
addOnLayoutChangeListener to 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);
}
Ответ 3
Я создал расширенный ViewFlipper, который делает именно это: DecentViewFlipper
Ответ 4
Пока это старый вопрос, я нашел достойный подход, который работает.
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(). Это помогает в настройке различных анимаций для левого и правого листания и для легкого получения текущих рабочих просмотров.