読者です 読者をやめる 読者になる 読者になる

Zinc #21 タブの削除

タブの削除を実装するわけだが、やってみるとこれまでの課題の中では、今のところ一番難しかった・・・。

FragmentTabHostやTabWidgetのremove系メソッドでは削除されなかったり、タブだけが消えてフラグメント側は消えていないように見えたり、別のタブを押すと落ちたりなど、3日ぐらい苦労した・・・。
その結果、

musyamusya: TabHostのタブを1つだけ削除する

こちらの方のように、clearAllTabsで全て消してから、とっておいたTabSpecを使って削除した対象以外を再生成する方法が一番簡単で安定しているという結論に至った・・・。

というわけでその方法で・・・。

まず、menu_main.xmlに、

action_currenttab_deleteというメニューアイテムを追加・・・。

titleはstrings.xmlで、

"このタブを削除"とする・・・。
現在表示しているタブを削除するメニューアイテム・・・。
(本当はタブの横に閉じるボタンを付けたかったが、そちらも難しいのでいったんキャンセル・・・。)

MainActivity.javaで、

TabSpecのListとしてtabSpecsを用意・・・。

onCreateで、

tabSpecsを生成して、そこに最初のタブのtabSpecを格納・・・。
で新しいタブを追加するたびに、

tabSpecsにどんどん追加・・・。

"このタブを削除"では、

タブが1個の場合はfinish・・・。

そうでない場合、tabSpecsから現在のタブのtabSpecだけ削除・・・。
そして、tabHost.clearAllTabsでタブをすべて削除・・・。
さらに一応、fragmentTransaction.removeを繰り返して、すべてのフラグメントも削除・・・。
そのあと、tabSpecsをもとにタブを再度追加していく・・・。

f:id:BG1:20160725213018p:plain

新しいタブ1は路線情報・・・。

f:id:BG1:20160725213054p:plain

新しいタブ2はスポナビ・・・。

f:id:BG1:20160725213119p:plain

新しいタブ3はショッピング・・・。

f:id:BG1:20160725213155p:plain

新しいタブ2を選択・・・。

f:id:BG1:20160725213223p:plain

ここで"このタブを削除"を押す・・・。

f:id:BG1:20160725213246p:plain

新しいタブ2が消えて、一番最初のタブである新しいタブ1が表示される・・・。
(直前のタブにするには、ちょっと工夫がいるので、今回はパス・・・。)

f:id:BG1:20160725213451p:plain

さらにここでも"このタブを削除"を押すと、

f:id:BG1:20160725213519p:plain

新しいタブ3だけになる・・・。

ここで"このタブを削除"を押した場合は、

f:id:BG1:20160725213559p:plain

閉じる・・・という感じ・・・。

いやはや、タブブラウザ、キツイ・・・。
しかし、TabSpecでWebViewのWebBackForwardListの情報まで復元されてるとは・・・。
(タブとフラグメントを全て消してるのに、この情報が残っているのは助かる・・・。)

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