2012-04-11 4 views
0

Ich habe zwei LinearLayout Ansichten, die eine Reihe von bearbeiten Texte und Kontrollkästchen für die Eingabe von Benutzerinformationen (Name, E-Mail-Adresse usw.) enthalten. Wenn eine Validierung in einem dieser Felder fehlschlägt, wird eine ungültige Textansicht mit dem Validierungsfehler angezeigt.Seltsame Probleme mit View Switcher nach Objekt Animator Animationen

Ich habe die zwei Layouts in einem ViewSwitcher eingeschlossen und animiere zwischen den beiden Ansichten mit der ObjectAnimator-Klasse. (Da der Code ältere Versionen von Android unterstützen muss, verwende ich dafür die Rückwärtskompatibilitätsbibliothek von neonoldandroids).

Der Großteil der Arbeit wird in meiner Methode switchToChild ausgeführt.

Wenn ich die Ansichten mehr als zweimal umblättere, dann fange ich an, seltsame Fehler zu bekommen.

Erstens, obwohl die korrekte untergeordnete Ansicht des Ansichtsanimators angezeigt wird, scheint es, dass die andere Ansicht den Fokus hat und ich auf die Ansichten unterhalb des aktuellen klicken kann. Ich habe dieses Problem gelöst, indem ich am Ende der ersten Animation einen viewSwitcher.bringChildToFront hinzugefügt habe.

Wenn ich dies jedoch tue und eine Validierung in der zweiten Ansicht durchführe, wird die Sicht "weg", die ich jetzt auf sichtbar gesetzt habe, nicht angezeigt (als ob das lineare Layout nie neu gemessen würde). Hier ist eine Teilmenge der XML-Datei:

<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" > 

Und das ist die wichtigste Methode für Spiegeln zwischen den Ansichten:

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(); 

    } 
} 

Hat jemand irgendwelche Ideen? Das verwirrt mich wirklich!

Antwort

0

Es sieht so aus, als wäre die beste Lösung, keinen View Switcher zu verwenden, sondern stattdessen einen eigenen zu erstellen, indem ich ein FrameLayout um die zwei Seiten deklariere und die Sichtbarkeit der zweiten Seite auf Null setze.

Die switchToChild Methode (die ich wahrscheinlich zu Seite wechseln sollte umbenennen und in der 1 oder 2-Wert tatsächlich passieren) setzt einfach die entsprechenden Ansichten in den Animationen sichtbar:

private void switchToChild(final int 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; 
    } 
    if (invisibleView.getVisibility() != View.VISIBLE) { 
    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) { 
     visibleView.setVisibility(View.GONE); 
     invisibleView.setVisibility(View.VISIBLE); 

     invisToVis.start(); 

     } 
    }); 
    visToInvis.start(); 
    } 

} 
Verwandte Themen