ユーザー情報(名前、メールアドレスなど)を入力するための編集テキストとチェックボックスを多数含む LinearLayout ビューが 2 つあります。これらのフィールドのいずれかで検証が失敗すると、テキストビューが表示されなくなり、検証エラーが表示されます。
ViewSwitcher 内に 2 つのレイアウトを含め、ObjectAnimator クラスを使用して 2 つのビュー間でアニメーション化します。(コードはAndroidの古いバージョンをサポートする必要があるため、実際にはnineoldandroids後方互換性ライブラリを使用しています).
作業の大部分は、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();
}
}
誰にもアイデアはありますか?これは本当に私を混乱させます!