タブ内での画面遷移

今日は夏休み開けの出勤です。頭が回らない中、表題の問題に取り組んでいました。

タブ内で画面遷移するとは、次のようにタブは切り替わらず、タブの内容だけ切り替わるということです。もちろん画面遷移なので、戻る遷移もさせたいところです。

参考にさせて頂いたサイトはこちらです。


Y.A.Mの雑記帳 Android 1画面 複数Activity で画面遷移 - ActivityGroup -


上記サイトを見ると私の拙い説明を理解してもらえると思います。ですが困ったことに戻る遷移がうまく行きません。ていうか戻る動作は出来るのですがあるActivityではキー (戻るキー) を受け取れて、別のActivityでは受け取れない (親のActivityGroupが受け取ってしまう) という問題に突き当たりました。



問題は解決しませんが、整理の意味も含めて調査します。

まず↑のサイトで公開されているサンプルプロジェクトをちょっと改変します。戻る遷移が出来るようにします。



この時画面遷移元、先画面で戻るキーを押すと、ActivityGroupのonBackPressedが呼ばれます。つまりキーは親が全て飲み込むわけです。

次に少し画面の構成を変えて、画面遷移元の画面にListViewを置いてみます。するとどうしたことでしょう!結果が違うのです。



この時遷移前の画面で戻るキーを押すと遷移前画面のActivityのonBackPressedが呼ばれます。これに対して遷移後の画面で戻るキーを押すとActivityGroupのonBackPressedが呼ばれます。これ、どういうこと?ListViewがレイアウトの中にあるとActivityでキーイベントを拾うことが出来るってこと?

試しに遷移後の画面にもListViewを置いてみます。結果はこんな感じでした。

  1. ListViewを置くだけ → 遷移後画面でキーイベント拾えず
  2. ListViewに空文字列設定 → 遷移後画面でキーイベント拾えず
  3. ListViewに文字列二つ設定 → 遷移後画面でキーイベント拾えず


う〜ん、ListViewがあったからといってキーイベントが拾えるわけではないようですね。では遷移前と遷移後の画面 (Activity) を入れ替えるとどうなるか?結論は入れ替えた後の遷移前の画面ではキーイベントを拾うことが出来ました。


これまでの状況を整理すると、タブコンテンツにActivityGroupを突っ込んだ場合、

  1. ActivityにListViewが含まれない → キーイベントは全てActivityGroupが拾う
  2. ActivityにListViewが含まれる → 画面遷移最初のActivityのみキーイベントを拾う


ListViewが特殊ですね。ListView以外にもあるかも知れませんが。少なくともどちらかに統一して欲しいです。。。


この問題、ちょっと気になるのでもうちょっと調べようかな。