ユーザー情報(名前、電子メールアドレスなど)を入力するための多数の編集テキストとチェックボックスを含む2つのLinearLayoutビューがあります。これらのフィールドのいずれかで検証が失敗すると、検証エラーを示すテキストビューが表示されます。オブジェクトアニメーターアニメーションの後のビュースイッチャーでの奇妙な問題
私はViewSwitcher内に2つのレイアウトを囲み、ObjectAnimatorクラスを使用して2つのビューの間でアニメーションを作成しました。 (コードはAndroidの古いバージョンをサポートする必要があるので、私は実際にこれに対して9oldandroidsの下位互換性ライブラリを使用しています)。
作業の大半は、switchToChildメソッドで実行されます。
ビューを2回以上フリップすると、私は奇妙なエラーに遭遇します。
最初にビューアニメーターの正しい子ビューが表示されますが、他のビューにフォーカスがあり、現在のビューの下にあるビューをクリックすることができます。私は最初のアニメーションの最後にviewSwitcher.bringChildToFrontを追加してこの問題を解決しました。
しかし、これを実行して2番目のビューで検証を実行すると、私は現在可視に設定されている "消えた"ビューが表示されません。ここではXMLファイルのサブセットです:
<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" >
そして、これは、ビュー間めくるための主な方法です。
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();
}
}
誰がどんな考えを持っていますか?これは本当に私を混乱させている!