ViewGroupの下のすべてのViewを削除するには、ViewGroup.removeAllViewsを使う。
ViewGroup | Android Developers
そもそもActivityはどうやってViewを持っているのかについて、ActivityのView構造を検証する。
activity_main.xmlは、FrameLayoutのみにする。
activity_sub.xmlは、LinearLayoutの下に、TextViewに加えて、WebViewも置く。
MainActivityにて、
まず、これだけのメンバフィールドを用意。
MainActivityのDecorViewの下0番目はLinearLayoutとしてキャストしていく。
(必ずしもそうとは限らないことを考えてエラー処理もしている。)
上記LinearLayoutの下0番目がFrameLayoutか確認し、そうであったらこれがmainContentView。
そうでない場合、1番目がmainContentView。
つまり、前のViewGroup.getChildCountの項に書いていた、「DecorViewの下のLinearLayoutがトップのLinearLayout」は間違い。
FrameLayoutをmainContentViewとしたが、これがactivity_main.xmlのframe_mainかというと、そうでもない。
vgMainContentView.getChildAt(0)をmFrameMainとしている通り、FrameLayoutの下の0番目がトップレイアウト。
さきほどの、LinearLayoutの下のFrameLayoutでないほうは、おそらくActionBar。
こんな感じで結構複雑になっている。しかも、機種やバージョンやレイアウトの状況によっても、LinearLayoutの下0番目がFrameLayoutとは限らないので厄介である。
今度はSubActivityの構造を調べて、R.id.linear_subに相当するものを探す。
こっちも同様。
frame_mainの下をremoveAllViewsですべて削除する。
その後、1つ目のdecorViewを追加する。
frame_mainの下がSubActivityのdecorViewになっているということ。
メニューでレイアウトの切り替え処理を実装。
SubActivityは、
tagをtextview1にセットし、test1ならyahoo, そうでないならgoogleをWebViewにロードさせる。
Aが出るということは、0番目がmainContentView。
FrameLayoutであることもわかる。
そしてTextView2を押して、切り替えると、
今度はGoogleに切り替わる。
5は、mVGFrameMainにキャストしたところ。
アルゼンチンなどと適当に入れて検索をしてみる。
このように検索結果が出る。
ここでTextView1にまた切り替える。
Yahooに戻るが、ロードはされてない。
スポナビにアクセス。
またTextView2に切り替える。
さっきのアルゼンチンが維持されている。
つまり、この方法で、Viewの状態を維持したまま、Viewを切り替えられるということ。
おそらく昔はこういう方法で、タブブラウザなどView状態を維持したままViewを切り替えるような処理を実装していたのではないだろうか。
わからんけど。
ただ、removeAllViewsでいちいち削除するのは面倒である。
Sample/android/ViewGroup/removeAllViews/src/ViewGroup at master · bg1bgst333/Sample · GitHub