改善が必要なViewFlipperの実装があります。このViewFlipperには、3つの子ビューがあります。基本的に、どの子ビューが現在アクティブであるかを示すインジケーターが必要です。 My ViewFlipperは、リストビューなどもある複雑なレイアウトの一部にすぎません。
ビューの切り替えも自動で、指定された間隔で行われます。
AndroidのSDKリファレンスから、ViewFlipperが子ビューを変更するときのリスナーを見たことがありません。
私がそのイベントのリスナーを持つことができる方法を知っていますか?
または、ViewFlipperを使用する以外に、この機能を実装できる別の方法はありますか?
ありがとう!
ビューの切り替え時にアニメーション(アニメーションのアウトまたはイン)を適用する場合、リスナーをアニメーションに設定し、たとえば、アニメーションの終了時に動作することができます。
viewFlipper.getInAnimation().setAnimationListener(new Animation.AnimationListener() {
public void onAnimationStart(Animation animation) {}
public void onAnimationRepeat(Animation animation) {}
public void onAnimationEnd(Animation animation) {}
});
どの子がアクティブになっているかを検出する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);
}
私はこの質問にすでに答えがあることを知っています。しかし、これはViewFlipper
から継承されたメソッドViewGroup
であり、私の経験からは最高のように思われる代替手段です。
以下のコードスニペット:
_ViewFlipper viewFlipper = findViewById (R.id.myViewFlipperId);
viewFlipper.setOnHierarchyChangeListener(ViewGroup.OnHierarchyChangeListener);
_
コールバックリスナーのonChildViewAdded(View, View)
メソッドは、子ビューがViewGroup
に追加されるたびに呼び出されます。 ViewFlipper
が反転するたびに検出するために使用できます。
ViewGroup.html#setOnHierarchyChangeListener API Docs を参照してください
私はまさにそれを行う拡張ViewFlipperを作成しました: DecentViewFlipper