質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

1876閲覧

FragmentManagerのshowとhideの使い方がわからない

KIRIN3

総合スコア28

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2021/08/08 06:59

BottomNavigationによるタブの切り替えで、タブを切り替えても各フラグメントの内容が維持されたままにしたいと考えています。
しかしタブ切り替え時に以下のメソッドを呼び出すようにしたのですが、Fragment表示部分が真っ白になり意図した動作になりません。
hide部分を削除するとaddされていきフラグメントが重なって表示されていくことは確認済みです。

addされたフラグメント全てhide

フラグメントマネージャーからadd済みの表示したいフラグメント取得

無ければadd

表示したいフラグメントをshow
という考え方がおかしいのでしょうか?

Kotlin

1 private fun addFragment(menuItemId: Int) { 2 val transaction = supportFragmentManager.beginTransaction() 3 val fragments = supportFragmentManager.fragments 4 // addされているフラグメントを全て隠す 5 for (fra in fragments) { 6 transaction.hide(fra) 7 } 8                // FragmentManagerから表示したいadd済みフラグメント取得 9                var fragment = getFragmentFromMng(getTag(menuItemId)) 10 11 // 未addだったら表示したいフラグメントをadd 12 if( fragment == null){ 13 // フラグメントのインスタンスを取得 14 fragment = createFragment(menuItemId) ?: return 15 transaction.add( 16 R.id.main_fragment, 17 fragment, 18 getTag(menuItemId) 19 ) 20 } 21 // 表示したいフラグメントをshow 22 transaction.show(fragment) 23 transaction.addToBackStack(null) 24 transaction.commit() 25 } 26 27 private fun getFragmentFromMng(tag: String): Fragment? { 28 val fragments = supportFragmentManager.fragments 29 30 for (fragment in fragments) { 31 if (fragment.tag.equals(tag)) { 32 return fragment 33 } 34 } 35 return null 36 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2021/08/09 11:43 編集

AndroidStudio をご利用でプロジェクト作成時に BottomNavigationActivity を選ばれていれば、そのようなコードを入れずとも各フラグメントは切り替えられ、情報も(ViewModel によって)保持されているのではありませんか?
KIRIN3

2021/08/09 10:53

質問ありがとうございます。 そちらを選択して作成していたのですが、デフォルトでNavigationによるFragment切り替えになっており、NavigationではFragmentを生かしたままタブの切り替えができず、自作でFragmentの切り替え処理を追加しようと試みています。
jimbe

2021/08/09 11:49 編集

> Fragmentを生かしたまま というのは、「切り替えても各フラグメントの内容が維持されたまま」という部分のことでしょうか。 BottomNavigationActivity の各フラグメントの ViewModel は ViewModelProvider(this) として得られている為、フラグメントと同じライフサイクルで生成・破棄されてしまっていますが、 ViewModelProvider(requireActivity()) とすることで MainActivity と同じライフサイクルになり、切り替えてもデータは保持されるように(ViewModel がフラグメントのライフサイクルに影響されなく)なります。
KIRIN3

2021/08/09 13:33

ViewModelやDBにデータを保持してFragmentの内容の再生成をすぐにできるのですが、例えば一つのタブでアプリ内ブラウザを開きっぱなしにしたい場合、ページの情報をファイルなどに保存しておいてもタブを切り替えるたびにリロードが僅かに走ります。 そこら辺のケアや煩わしさを考えるとFragmentを自作で管理した方が良いかとサンプルを作成しています。
jimbe

2021/08/09 16:11 編集

過去のご質問からこのような作業に入られたようですね。 (一連のご質問に関係がある場合は、それぞれへのリンクを入れて頂けると助かります。) 個人的には WebView の動作を抑える為にフラグメントの管理を行うのは「お門違い」か「やりすぎ」の類に感じますが…(個人の感想です。回避策を知っているわけではありません。) それで、ここまで書いて何ですが、ご提示のコードにつきまして、 transaction.hide(fra) で一旦全てを消すのではなく、fra が show 対象であった場合は hide しないようにしてみては如何でしょう。 朧げな記憶では、 Transaction の中での操作の順番は記述した順番通りとは決まっておらず、従って同じフラグメントに対して show と hide が一つの Transaction 内で指定された場合等は show→hide(結果"消去") になるか hide→show (結果"表示")になるか分からない…だったと思います。 ですが、このようなことを書いてある資料を探したのですが見当たりませんでした。スミマセン orz
KIRIN3

2021/08/10 15:05

>個人的には WebView の動作を抑える為にフラグメントの管理を行うのは「お門違い」か「やりすぎ」の類に感じますが… こちらはその通りだと思います。 ただWebViewメインの機能だったことと、他にも不都合があったのでFragmentの操作を勉強するついでに、サンプルを作成してみようと思いました。 >transaction.hide(fra) で一旦全てを消すのではなく、fra が show 対象であった場合は hide しないようにしてみては如何でしょう。 こちらhideする対象を調査したところFragment一覧を取得するとxmlに記載した"androidx.navigation.fragment.NavHostFragment!が含まれており、こちらをhideしているため何も表示されなくなっていました。 ご指摘の通りhide対象を選択したところ問題なく動作しました。 ご回答いただきありがとうございました。
jimbe

2021/08/10 15:57

> こちらはその通りだと思います。 全く釈迦に説法だったようで失礼致しました(_ _;
KIRIN3

2021/08/11 13:21

いえいえ、おかげさまで解決いたしました。 ありがとうございました。 ここでのやり取りで解決してしまった場合はどうすればいいんだろうか・・・ 簡単にでも回答を書いていただければそれにて解決といたしますが、面倒なようでしたらこちらで回答を記載しておきます。
jimbe

2021/08/11 13:46

自己解決されてOKです ^^b
KIRIN3

2021/08/11 14:12

承知しました。 ありがとうございました!
guest

回答1

0

自己解決

一括してhideしているのが原因で、対象のものを厳選してhideすることで自己解決

投稿2021/09/14 12:45

KIRIN3

総合スコア28

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問