侦听ViewFlipper小部件翻转事件

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

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

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

你们知道我可以为这个活动听一听吗?

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

谢谢!

Solutions Collecting From Web of "侦听ViewFlipper小部件翻转事件"

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

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

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

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

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

虽然这是一个古老的问题,但我find了一个合适的方法。

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