【AndroidのViewを制する】 ViewSwitcherとViewSwitcher.ViewFactoryを使いこなして2つのViewを切り替える
今回、紹介する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);