ウィジェットからのアプリ起動時、WebViewが仕事タブを選択している状態にする
【現状】
- ウィジェットからのアプリ起動時、Homeタブを選択している
【調査・検討まとめ】
- ウィジェットからではなく、普通にログインした際に、タブ初期選択を変更することはできる
- ファイル:MainActivity.kt
- 関数:setupBottomNavigationBar
上記のファイル・関数において下記コードを最後に組み込めば、初期選択を変えることはでき、その後のタブ切り替えにも影響を与えない
bottomNavigationView.selectedItemId = R.id.workListNavigation(仕事タブに切り替える)
- ウィジェットからのアプリ起動は、URL遷移を伴うため上記のコードを動かすとアプリが落ちてしまう
if (!intent.getStringExtra(APPROVAL_DEEPLINK_URL_KEY).isNullOrEmpty()) {
bottomNavigationView.selectedItemId = R.id.workListNavigation
}
上記のコードはアプリが落ちる
- 実装としては上記の関数内か下記関数内で実装するのではないかと考えている
- ファイル:MainActivity.kt
- 関数:followDeepLink
上記の関数の場合、下記コードを最後に組み込めば、初期選択を変えることはでき、その後のタブ切り替えにも影響を与えない
findViewById<BottomNavigationView>(R.id.bottom_navigation_bar).selectedItemId = R.id.workListNavigation
こちらの関数内での実装の場合、ウィジェットからのアプリ起動時に、アプリが落ちることはないが、
仕事タブにてURL遷移するわけではなく、Homeタブ上にてURL遷移している
また、Homeタブ切り替えたとき、WebView再読み込みが動いておらず、
バックキーをタップしていくとアプリ終了時にエラーとなり、アプリが落ちる
- 実装及びアプリ動作を見ている限り、URL遷移というよりは、
Homeタブの上に新たなFragmentを表示している感じになっており、そもそもの実装がよくないのかもしれない・・・
6/28 調査
- bottomnavigationViewの選択状態を変更する方法
http://mokelabtech.blogspot.com/2017/02/androidbottomnavigationview.html
https://blog.dododori.com/create/program/bottomnavigationview_clicked/
7/6 検証
- 上記URLを参考に、MainActivity.ktのfollowDeepLink()メソッドのif内の最後に、下記を追記すると
仕事タブを選択しているように見せかけることは可能
val bottomNavigationView =findViewById<BottomNavigationView(R.id.bottom_navigation_bar).menu.getItem(1)
bottomNavigationView.setChecked(true)
上記プログラムでは、仕事タブを選択している状態でwebView内でリダイレクト処理が行われるタブ遷移などをせずに、バックキーを押下した場合正常に動作する。
上記のプログラムで数点確認している課題
- 仕事タブを選択している状態でwebView内でリダイレクト処理が行われることが原因で、Homeタブタップ時に何も反応しない
- 書類作成タブ、検索タブをタップした場合、webView内にHome画面が表示される。
- それらをタブ切り替え操作を繰り返し行い、バックキー操作を繰り返し行うとアプリが落ちる
- アプリを一度バックグラウンドにして、フォアグラウンドに復帰すると、Homeタブが自動で選択され、Homeのページがリロードされる
前回動作検証時と同様、Home画面の上に新しいFragmentを表示しているような印象を受ける
- performClick()についても検証
⇒ アプリが落ちてしまう
7/7(さらに検証)
MainActivity.ktのfollowDeepLinkメソッドのif内を下記に修正すると正常に初期タブを切り替えることを確認、バックキー等でエラーも起きないため、タブ切り替え自体は問題ない
val deepApproveUrl = intent.getStringExtra(APPROVAL_DEEPLINK_URL_KEY)
if (!deepApproveUrl.isNullOrEmpty()) {
findViewById<BottomNavigationView>(R.id.bottom_navigation_bar).selectedItemId = R.id.workListNavigation
}
問題としては、初期タブを切り替えたあとにwebview内でリダイレクト処理を走らせる処理をどうするかで、
supportFragmentManager.beginTransaction()の修正必要
最終的な修正方針
MainActivity.kt
- followDeepLink()メソッド内にてウィジェットから起動した際にタブ切り替えを行い、intentからURLの情報を取り出して保持する
- 保持する先はAppRepository.ktにてString型の変数を用意
AppRepository.kt
- URL情報を保持、取得するためのメソッドを用意
DocumentWebFragment.kt
- onViewCreated()にてAppRepositoryにあるURLがnullでない場合、アクセス先のURLをAppRepositoryにあるURLへ変更、アクセスする
動作確認
正常にタブ切り替え、リダイレクト処理が動くことを確認