Strange issues with view switcher after object animator animations

Posted by Barry Irvine on Stack Overflow See other posts from Stack Overflow or by Barry Irvine
Published on 2012-04-11T11:26:48Z Indexed on 2012/04/11 11:29 UTC
Read the original article Hit count: 257

I have two LinearLayout views that contain a number of edit texts and checkboxes for entering user information (name, email address etc). When a validation fails on one of these fields a gone textview is displayed showing the validation error.

I have enclosed the two layouts within a ViewSwitcher and I animate between the two views using the ObjectAnimator class. (Since the code needs to support older versions of Android I am actually using the nineoldandroids backwards compatibility library for this).

The bulk of the work is performed in my switchToChild method.

If I flip the views more than twice then I start to run into strange errors.

Firstly although the correct child view of the view animator is displayed it seems that the other view has focus and I can click on the views beneath the current one. I resolved this issue by adding a viewSwitcher.bringChildToFront at the end of the first animation.

When I do this however and perform a validation on the 2nd view the "gone" view that I have now set to visible is not displayed (as if the linearlayout is never being re-measured). Here is a subset of the XML file:

<ScrollView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/TitleBar"
    android:scrollbarAlwaysDrawVerticalTrack="true"
    android:scrollbarStyle="outsideOverlay"
    android:scrollbars="vertical" >

    <ViewSwitcher
        android:id="@+id/switcher"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <LinearLayout
            android:id="@+id/page_1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

        <!-- Lots of subviews here -->

        <LinearLayout
            android:id="@+id/page_2"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

And this is the main method for flipping between the views:

private void switchToChild(final int child) {
  final ViewSwitcher viewSwitcher = (ViewSwitcher) findViewById(R.id.switcher);
  if (viewSwitcher.getDisplayedChild() != child) {
    final Interpolator accelerator = new AccelerateInterpolator();
    final Interpolator decelerator = new DecelerateInterpolator();
    final View visibleView;
    final View invisibleView;
    switch (child) {
      case 0:
        visibleView = findViewById(R.id.page_2);
        invisibleView = findViewById(R.id.page_1);
        findViewById(R.id.next).setVisibility(View.VISIBLE);
        findViewById(R.id.back).setVisibility(View.GONE);
        break;
      case 1:
      default:
        visibleView = findViewById(R.id.page_1);
        invisibleView = findViewById(R.id.page_2);
        findViewById(R.id.back).setVisibility(View.VISIBLE);
        findViewById(R.id.next).setVisibility(View.GONE);
        break;
    }
    final ObjectAnimator visToInvis = ObjectAnimator.ofFloat(visibleView, "rotationY", 0f, 90f).setDuration(250);
    visToInvis.setInterpolator(accelerator);

    final ObjectAnimator invisToVis = ObjectAnimator.ofFloat(invisibleView, "rotationY", -90f, 0f).setDuration(250);
    invisToVis.setInterpolator(decelerator);

    visToInvis.addListener(new AnimatorListenerAdapter() {

      @Override
      public void onAnimationEnd(Animator anim) {
        viewSwitcher.showNext();
        invisToVis.start();
        viewSwitcher.bringChildToFront(invisibleView); // If I don't do this the old view can have focus

      }
    });
    visToInvis.start();

  }
}

Does anyone have any ideas? This is really confusing me!

© Stack Overflow or respective owner

Related posts about android

Related posts about android-animation