Zinc #20 新しいタブの追加

新しいタブを追加する機能を実装する・・・。

まずは、

android:id="@+id/action_newtab_add"なるメニューアイテムを追加し、

"新しいタブ"という表示名に・・・。

MainActivity.javaは、

"新しいタブ"を選ぶと、新しいタブが1つ追加される・・・。

最初のタブが"新しいタブ1"なので、追加されるのは"新しいタブ2"・・・。

WebViewTabFragment.javaは、

インスタンス状態を持つBundle型のmInstanceStateをメンバとしてもっておく・・・。
onCreateViewで引数として渡されるsavedInstanceStateを使わないのには理由がある・・・。
タブでフラグメントを切り替えたとき、隠れるフラグメントはonDestroyViewは呼ばれても、onDestroyが呼ばれない・・・。
そのため、onSaveInstanceStateも呼ばれず、インスタンス状態をそのまま保存できない・・・。
よって、次にonCreateViewが呼ばれた時、savedInstanceStateから状態が復元できない・・・。
webViewの状態復元に必要なのに・・・。結果webViewが真っ白になってしまう・・・。
そこでメンバとして持たせることで、保存・復元が可能になる・・・。

webViewを取得したら、BundleをnewしてmInstanceStateに入れる・・・。
webView.saveStateでmInstanceStateに保存
このフラグメントが隠れても、onDestroyは呼ばれないので値は保持される・・・。
このフラグメントが再び表に出た時、

mInstanceStateがあるので、webView.restoreStateでmInstanceStateからwebViewの状態が復元される・・・。

f:id:BG1:20160721165303p:plain

起動して、

f:id:BG1:20160721165324p:plain

yahoo.co.jp

f:id:BG1:20160721165342p:plain

ロードされた・・・。

f:id:BG1:20160721165403p:plain

メニューの新しいタブ・・・。

f:id:BG1:20160721165451p:plain

新しいタブ2ができてる・・・。

f:id:BG1:20160721165531p:plain

新しいタブ2を選択すると、まだ何も表示されてない・・・。

f:id:BG1:20160721165716p:plain

bg1.hatenablog.comを指定・・・。

f:id:BG1:20160721165812p:plain

ブログが表示された・・・。

f:id:BG1:20160721165953p:plain

リンク先も行ける・・・。

f:id:BG1:20160721170037p:plain

新しいタブ1に戻っても表示される・・・。
リロードされるのはWebViewClientなどを毎回newしているから・・・。
(この問題は解決策がまだ見つかっていない・・・。)

f:id:BG1:20160721170354p:plain

スポナビに進む・・・。

f:id:BG1:20160721170436p:plain

また新しいタブ2に・・・。

f:id:BG1:20160721170458p:plain

ここでバックすると、ブログトップに戻る・・・。
さらにバックすると終了する・・・。

タブというかフラグメントごとにWebViewが独立していて、そのWebViewの最初のページで戻るを押すと、アクティビティを閉じるようになっている・・・。
(この辺は特にいじる必要なく実現できている・・・。よかった・・・。)

https://github.com/bg1bgst333/Zinc/tree/develop/android/empty_activity/android_studio/src/Zinc