web-dev-qa-db-ja.com

ViewFlipperウィジェットフリッピングイベントのリスナー

改善が必要なViewFlipperの実装があります。このViewFlipperには、3つの子ビューがあります。基本的に、どの子ビューが現在アクティブであるかを示すインジケーターが必要です。 My ViewFlipperは、リストビューなどもある複雑なレイアウトの一部にすぎません。

ビューの切り替えも自動で、指定された間隔で行われます。

AndroidのSDKリファレンスから、ViewFlipperが子ビューを変更するときのリスナーを見たことがありません。

私がそのイベントのリスナーを持つことができる方法を知っていますか?

または、ViewFlipperを使用する以外に、この機能を実装できる別の方法はありますか?

ありがとう!

25
Shane Oliver

ビューの切り替え時にアニメーション(アニメーションのアウトまたはイン)を適用する場合、リスナーをアニメーションに設定し、たとえば、アニメーションの終了時に動作することができます。

   viewFlipper.getInAnimation().setAnimationListener(new Animation.AnimationListener() {
      public void onAnimationStart(Animation animation) {}
      public void onAnimationRepeat(Animation animation) {}
      public void onAnimationEnd(Animation animation) {}
   });
40

どの子がアクティブになっているかを検出する1つの方法を見つけました:

AddOnLayoutChangeListenerをViewFlipperに追加し、ViewFlipperのgetCurrentViewを取得してから、ViewFlipperの子と比較します。

アクティビティonDestoryの場合は必ずremoveOnLayoutChangeListenerを削除してください

private View page1, page2, page3, page4;
private ViewFlipper viewFlipper;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.flipper);

    page1 = findViewById(R.id.MyFlipper_page01);
    page2 = findViewById(R.id.MyFlipper_page02);
    page3 = findViewById(R.id.MyFlipper_page03);
    page4 = findViewById(R.id.MyFlipper_page04);

    viewFlipper = (ViewFlipper) findViewById(R.id.MyFlipper_flipper);

    viewFlipper.addOnLayoutChangeListener(onLayoutChangeListener_viewFlipper);

}

View.OnLayoutChangeListener onLayoutChangeListener_viewFlipper = new View.OnLayoutChangeListener() {
    @Override
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {

       if(viewFlipper.getCurrentView() == page1)
           Log.d("test", "change to flipper_page1");
       else if(viewFlipper.getCurrentView() == page2)
           Log.d("test", "change to flipper_page2");
       else if(viewFlipper.getCurrentView() == page3)
           Log.d("test", "change to flipper_page3");
       else if(viewFlipper.getCurrentView() == page4)
           Log.d("test", "change to flipper_page4");



    }
};


@Override
protected void onDestroy() {
    super.onDestroy();

    viewFlipper.removeOnLayoutChangeListener(onLayoutChangeListener_viewFlipper);

}
2
HenryChuang

私はこの質問にすでに答えがあることを知っています。しかし、これはViewFlipperから継承されたメソッドViewGroupであり、私の経験からは最高のように思われる代替手段です。

以下のコードスニペット:

_ViewFlipper viewFlipper = findViewById (R.id.myViewFlipperId);
viewFlipper.setOnHierarchyChangeListener(ViewGroup.OnHierarchyChangeListener);
_

コールバックリスナーのonChildViewAdded(View, View)メソッドは、子ビューがViewGroupに追加されるたびに呼び出されます。 ViewFlipperが反転するたびに検出するために使用できます。

ViewGroup.html#setOnHierarchyChangeListener API Docs を参照してください

0
Moses Katsina

私はまさにそれを行う拡張ViewFlipperを作成しました: DecentViewFlipper

0
slinden77