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!