ViewGroup.removeAllViews

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
A

Aが出るということは、0番目がmainContentView。

FrameLayoutであることもわかる。
FrameLayoutであることもわかる。

FrameLayoutであることもわかる。
そしてTextView2を押して、切り替えると、

今度はGoogleに切り替わる
今度はGoogleに切り替わる

今度はGoogleに切り替わる。
5は、mVGFrameMainにキャストしたところ。

アルゼンチン
アルゼンチン

アルゼンチンなどと適当に入れて検索をしてみる。

このように検索結果が出る
このように検索結果が出る

このように検索結果が出る。

ここでTextView1にまた切り替える
ここでTextView1にまた切り替える

ここでTextView1にまた切り替える。

Yahooに戻るが、ロードはされてない。
Yahooに戻るが、ロードはされてない。

Yahooに戻るが、ロードはされてない。

スポナビにアクセス
スポナビにアクセス

スポナビにアクセス。

またTextView2に切り替える。
またTextView2に切り替える。

またTextView2に切り替える。

さっきのアルゼンチンが維持されている
さっきのアルゼンチンが維持されている

さっきのアルゼンチンが維持されている。
つまり、この方法で、Viewの状態を維持したまま、Viewを切り替えられるということ。
おそらく昔はこういう方法で、タブブラウザなどView状態を維持したままViewを切り替えるような処理を実装していたのではないだろうか。
わからんけど。
ただ、removeAllViewsでいちいち削除するのは面倒である。

Sample/android/ViewGroup/removeAllViews/src/ViewGroup at master · bg1bgst333/Sample · GitHub