スライドショーと切り替え
Androidのレイアウトに四苦八苦…
あるActivityからボタン操作でルート分岐したかったのだが、
それぞれActivityを作ってそれに飛んで…とすると
どうも操作性に欠ける気がするし、全体の工程が長く感じてしまう。
となるとそのActivity内で表示させてしまえばいいと思った次第。
Activity内でViewの動的な変更を行えるのが「ViewFlipper」
対象となるレイアウト群を作り、設置したViewFlipperにincludeする。
xxx.xml
省略 <ViewFlipper android:id="@+id/vFlipper" android:layout_width="wrap_content" android:layout_height="warp_content" > <include android:id="@id/flipA" layout="@layout/A" /> <include android:id="@id/flipB" layout="@layout/B" /> <include android:id="@id/flipC" layout="@layout/C" /> </ViewFlipper> 省略
activity.java
省略 ViewFlipper flipper; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.xxx); Button btn1 = (Button)findViewById(R.id.button1); btn1.setOnClickListener(this); Button btn2 = (Button)findViewById(R.id.button2); btn2.setOnClickListener(this); flipper = (ViewFlipper)findViewById(R.id.vFlipper); } 省略 @Override public void onClick(View view){ switch(view.getId) case R.id.button1: flipper.showNext(); break; case R.id.button2: flipper.showPrevious(); break; }
こんな感じでincludeした順番で次へ行ったり戻ったり表示を変えることができる。
また、startFlipping()とstopFlipping()でスライドショーも可能。
手動だけでなく時間設定をした自動スライドショーも可能。
ボタン操作だけでなくonFlingメソッドを作ればタッチ操作での切り替えも可能。
と、便利だけどあくまで順番に表示する進む戻る切り替えらしく
ボタン操作による完全なルート分岐とは違う。
いわゆるTVのチャンネルとリモコンの関係を作りたい。
そこのでInflateがある。
こちらはxml側で纏めるのではなく、表示用xml郡を作ってJava側で表示の切り替えを行う。
なのでViewFlipperではなく、なんらかのレイアウトを配置。
activity.java
省略 LinearLayout layout; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.xxx); Button btn1 = (Button)findViewById(R.id.button1); btn1.setOnClickListener(this); Button btn2 = (Button)findViewById(R.id.button2); btn2.setOnClickListener(this); layout = (linearLayout)findViewById(R.id.target); } 省略 @Override public void onClick(View view){ switch(view.getId) case R.id.button1: layout.removeAllViews(); getLayoutInflater().inflate(R.layout.A, layout); break; case R.id.button2: layout.removeAllViews(); getLayoutInflater().inflate(R.layout.B, layout); break; }
ボタンが押して対象のレイアウト内のViewをすべて消し、
Inflateで新たに表示することで切り替えが行われるようにするみたい。
こうしてレイアウトが対応されたボタン毎に切り替えて表示できる。
使い分けが必要。