【问题标题】:Listener for ViewFlipper widget flipping eventsViewFlipper 小部件翻转事件的侦听器
【发布时间】:2018-11-27 13:46:12
【问题描述】:

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

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

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

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

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

谢谢!

【问题讨论】:

    标签: android viewflipper


    【解决方案1】:

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

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

    【讨论】:

    • +1 谢谢!那钉了它。我使用的是基于 xml 的动画参数,所以我完全错过了。所以我现在在我的 Activity 中创建了 ViewFlipper 动画参数,而不是在我的 xml 中。
    • 总的来说,我发现在代码中设置更多而不是在 xml 中设置最方便
    • 它只有在你想要(并且拥有)动画时才有效:)否则它是空的
    【解决方案2】:

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

    将OnLayoutChangeListener添加到ViewFlipper,获取ViewFlipper的CurrentView,然后与ViewFlipper的childs进行比较。

    记得在活动 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);
    
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我喜欢你班级的名字 :-)
      【解决方案4】:

      虽然这是一个老问题,但我发现了一种不错的方法。

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

      【讨论】:

        【解决方案5】:

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

        代码片段如下:

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

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

        ViewGroup.html#setOnHierarchyChangeListener API Docs

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-09-04
          • 1970-01-01
          • 2017-07-27
          • 1970-01-01
          • 2020-09-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多