2012-04-11 7 views
0

ユーザー情報(名前、電子メールアドレスなど)を入力するための多数の編集テキストとチェックボックスを含む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(); 

    } 
} 

誰がどんな考えを持っていますか?これは本当に私を混乱させている!

答えて

0

2つのページの周りにFrameLayoutを宣言し、2番目のページの可視性をなくすことで、ビュースイッチャーを効果的に使用するのが最善の解決策でした。

単にアニメーション中に可視に適切なビューを設定する(Iはおそらくページに切り替えて、実際に1又は2の値を渡すために名前を変更すべきである)switchToChild方法:

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

}