27

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

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

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

你们知道我可以为那个事件设置一个监听器吗?

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

谢谢!

4

5 回答 5

42

如果您在视图切换上应用动画(出或入动画),您可以将侦听器设置为动画,例如,在动画结束时进行操作。

   viewFlipper.getInAnimation().setAnimationListener(new Animation.AnimationListener() {
      public void onAnimationStart(Animation animation) {}
      public void onAnimationRepeat(Animation animation) {}
      public void onAnimationEnd(Animation animation) {}
   });
于 2010-09-28T13:28:49.400 回答
4

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

将OnLayoutChangeListener添加到ViewFlipper,然后获取ViewFlipper的当前视图,然后与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);

}
于 2015-11-05T09:06:21.190 回答
0

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

于 2016-08-19T15:51:36.110 回答
-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() 获取当前活动的视图。这有助于为左右翻转设置不同的动画,并轻松获取当前工作视图。

于 2014-08-11T11:08:17.697 回答
-1

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

下面的代码片段:

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

onChildViewAdded(View, View)每当将子视图添加到ViewGroup. 您可以使用它来检测何时ViewFlipper翻转。

请参阅ViewGroup.html#setOnHierarchyChangeListener API 文档

于 2018-11-26T19:03:27.523 回答