我有一个需要改进的ViewFlipper实现。此ViewFlipper有三个子视图。基本上,我想要一个关于哪个子视图当前处于活动状态的指标。我的ViewFlipper只是复杂布局的一部分,它也有列表视图等。
视图切换也是自动的,并在指定的时间间隔内完成。
从Android的SDK参考资料中,我没有看到ViewFlipper何时更改子视图的任何监听器。
你们知道我可以为这个事件听一听吗?
或者除了使用ViewFlipper之外,还有其他方法可以实现此功能吗?
谢谢!
答案 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
翻转时,您可以使用它来检测。
答案 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()获取当前活动的视图。这有助于为左右翻转设置不同的动画,以及轻松获取当前工作视图。