监听ViewFlipper小部件翻转事件

时间:2010-09-28 13:19:38

标签: android viewflipper

我有一个需要改进的ViewFlipper实现。此ViewFlipper有三个子视图。基本上,我想要一个关于哪个子视图当前处于活动状态的指标。我的ViewFlipper只是复杂布局的一部分,它也有列表视图等。

视图切换也是自动的,并在指定的时间间隔内完成。

从Android的SDK参考资料中,我没有看到ViewFlipper何时更改子视图的任何监听器。

你们知道我可以为这个事件听一听吗?

或者除了使用ViewFlipper之外,还有其他方法可以实现此功能吗?

谢谢!

5 个答案:

答案 0 :(得分:39)

如果在视图切换中应用动画(输出或动画),则可以将侦听器设置为动画,例如,在动画结束时动作。

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

答案 1 :(得分:1)

我找到一种方法来检测哪个孩子被激活:

将addOnLayoutChangeListener添加到ViewFlipper和ViewFlipper的getCurrentView,然后与ViewFlipper的子节点进行比较。

记得在活动onDestory时删除OnLayoutChangeListener

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

}

答案 2 :(得分:0)

我已经创建了一个扩展的ViewFlipper,它正是这样做的:DecentViewFlipper

答案 3 :(得分:0)

我知道这个问题已经有了答案。但这是一种替代方法,它是一种从ViewFlipper继承而来的方法ViewGroup,根据我的经验,这似乎是最好的方法。

下面的代码段:

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

每当将子视图添加到onChildViewAdded(View, View)时,就会调用回调侦听器中的ViewGroup方法。 ViewFlipper翻转时,您可以使用它来检测。

请参见ViewGroup.html#setOnHierarchyChangeListener API Docs

答案 4 :(得分:-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()获取当前活动的视图。这有助于为左右翻转设置不同的动画,以及轻松获取当前工作视图。