【AndroidのViewを制する】 ViewSwitcherとViewSwitcher.ViewFactoryを使いこなして2つのViewを切り替える

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

今回、紹介するViewSwitcherはViewAnimatorを継承しています。
ViewAnimatorとの違いは2つの子Viewを切り替えることに特化していることです。

ViewSwitcher#setFactoryとViewSwitcher.ViewFactoryを使ってViewを2つ追加する

ViewSwitcherは子Viewを2つしか持つことができません。2つ以上追加しようとすると例外が発生します。
ViewSwitcherには、スーパークラスから継承したaddViewを使ってViewを追加する方法とViewSwitcher#setFactoryを追加ってViewを追加する方法があります。
ViewSwitcher.ViewFactoryにはViewを作成するファクトリメソッドViewSwitcher.ViewFactory#makeViewが定義されています。
このメソッドを実装し、ViewSwitcher#setFactoryに渡すことで自動的に子Viewを2つViewSwitcherに追加されます。
    // ViewSwitcherをインスタンス化
    final ViewSwitcher viewSwitcher = new ViewSwitcher(this);
    // ViewSwitcher.ViewFactoryを設定する
    viewSwitcher.setFactory(new ViewSwitcher.ViewFactory() {
        @Override
        public View makeView() {
            // 子Viewを作成
            TextView textView = new TextView(ViewSwitcherActivity.this);
            textView.setText( (viewSwitcher.getChildCount() + 1)+ "個目のView" ) ;
            return textView;
        }
    });
    // ViewSwitcherを設定したViewを表示する。
    setContentView(viewSwitcher);

ViewSwitcher#getNextViewを使って次に表示される子Viewを取得する

ViewSwitcher#getNextViewは次に表示される子Viewを返却するメソッドです。

    LinearLayout linearLayout = new LinearLayout(this);
    linearLayout.setOrientation(LinearLayout.VERTICAL);

    // ViewSwitcherをインスタンス化
    final ViewSwitcher viewSwitcher = new ViewSwitcher(this);
    viewSwitcher.setFactory(new ViewSwitcher.ViewFactory() {
        @Override
        public View makeView() {
            TextView textView = new TextView(ViewSwitcherActivity.this);
            textView.setText( (viewSwitcher.getChildCount() + 1)+ "個目のView" ) ;
            return textView;
        }
    });

    Button showNextView = new Button(this);
    showNextView.setText("次のViewのテキストを表示する");
    showNextView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // 次のViewのテキストをToast表示する
            Toast.makeText(ViewSwitcherActivity.this, (( TextView )viewSwitcher.getNextView()).getText(), Toast.LENGTH_SHORT).show();
        }
    });
    linearLayout.addView(viewSwitcher);
    linearLayout.addView(showNextView);

    // ViewSwitcherを設定したViewを表示する。
    setContentView(linearLayout);

ViewSwitcher#resetですべてを非表示にする

ViewSwitcher#resetは子Viewを非表示にするメソッドです。

    LinearLayout linearLayout = new LinearLayout(this);
    linearLayout.setOrientation(LinearLayout.VERTICAL);

    // ViewSwitcherをインスタンス化
    final ViewSwitcher viewSwitcher = new ViewSwitcher(this);
    viewSwitcher.setFactory(new ViewSwitcher.ViewFactory() {
        @Override
        public View makeView() {
            TextView textView = new TextView(ViewSwitcherActivity.this);
            textView.setText( (viewSwitcher.getChildCount() + 1)+ "個目のView" ) ;
            return textView;
        }
    });

    Button reset = new Button(this);
    reset.setText("リセット");
    reset.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {
           // ViewSwitcher内のViewをすべて非表示にする
           viewSwitcher.reset();
       }
    });

    linearLayout.addView(viewSwitcher);
    linearLayout.addView(reset);

    // ViewSwitcherを設定したViewを表示する。
    setContentView(linearLayout);