ViewFlipper小部件翻转事件的监听器

28

我有一个ViewFlipper实现需要改进。这个ViewFlipper有三个子视图。基本上,我希望有一个指示器来显示哪个子视图当前处于活动状态。我的ViewFlipper只是复杂布局的一部分,该布局还包括列表视图等。

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

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

您们是否知道如何为此事件添加监听器?

或者,除了使用ViewFlipper之外,是否有其他实现此功能的替代方法?

谢谢!

5个回答

43

如果你在视图切换时应用动画(进入或离开动画),你可以为动画设置监听器,并在动画结束时执行相应操作。

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

2
+1 谢谢!太准确了。我一直在使用基于 XML 的动画参数,所以完全忽略了这一点。现在我已经在我的 Activity 中创建了 ViewFlipper 动画参数,而不是将其放在我的 xml 中。 - Shane Oliver
通常情况下,我发现在代码中设置比在XML中设置更加方便。 - slinden77
1
只有在你想要(并且已经有)动画的情况下才能正常工作 :) 否则它是空的。 - Konrad Morawski

4
我找到了一种方法来检测哪个子项处于活动状态:

将addOnLayoutChangeListener添加到ViewFlipper中,并使用ViewFlipper的getCurrentView,然后与ViewFlipper的子项进行比较。

在activity onDestory时记得删除addOnLayoutChangeListener。
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

我喜欢你的类名 :-) - Pat Lee

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


-1

我知道这个问题已经有了答案。但是这里有一个替代方案,它是从ViewGroup继承的一个方法ViewFlipper,在我的经验中似乎是最好的选择。

以下是代码片段:

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

回调监听器中的onChildViewAdded(View, View)方法将在每次向ViewGroup添加子视图时被调用。您可以使用它来检测ViewFlipper翻转的情况。

请参见ViewGroup.html#setOnHierarchyChangeListener API文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接