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

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

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

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

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

Q&A

解決済

1回答

1798閲覧

FragmentContainerViewでネストしたカスタムDialogFragmentを一度閉じ、再度開くと表示が崩れる

maccadoo

総合スコア0

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

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

0グッド

0クリップ

投稿2020/12/01 05:14

前提・実現したいこと

SIPアプリを作っています。
転送画面をつくるためにTRANSFERボタンを作成し、カスタムのDialogFragmentを設置しました。
ボタンを押すと、正しくDialogFragmentが開きタブも正しく表示されるようになりました。

ところが、一度キャンセルボタンでDialogFragmentを閉じ、再度DialogFragmentを表示しようとすると、DialogFragment自体は開きますが、タイトルとタブは表示されるものの、FragmentContainerViewでネストしたFragmentが表示されません。

発生している問題

画面をキャプチャしましたので、ご覧ください。
画面キャプチャ

該当のソースコード

ソースコードはGithubに上げました
https://github.com/NetworkRevolution/NR-TEL

該当のDialogFragmentは特に変なことはしていません。

class XferDialogFragment : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val mainViewModel by viewModels<MainViewModel>() val binding = DataBindingUtil.inflate<XferDialogFragmentBinding>( LayoutInflater.from(requireActivity()), R.layout.xfer_dialog_fragment, null, false ) val navHostFragment = requireParentFragment().parentFragmentManager.findFragmentById(R.id.tab_dialog_navi_host) as NavHostFragment val navController = navHostFragment.navController val graph = navController.navInflater.inflate(R.navigation.tab_navigation) binding.tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab) { graph.startDestination = when (tab.position) { 0 -> R.id.tab0Fragment 1 -> R.id.tab1Fragment 2 -> R.id.tab2Fragment 3 -> R.id.tab3Fragment else -> return } navController.graph = graph } override fun onTabUnselected(tab: TabLayout.Tab) {} override fun onTabReselected(tab: TabLayout.Tab) {} }) mainViewModel.callNumber.observe(requireParentFragment(), { binding.viewModel = mainViewModel }) return AlertDialog .Builder(requireActivity()) .setTitle(R.string.incall_transfer_title) .setView(binding.root) .setPositiveButton(R.string.done) { _, _ -> } .setNeutralButton(R.string.cancel) { _, _ -> } .create() } }

前述しましたが、xmlはFragmentContainerViewでネストしてあり、addOnTabSelectedListenerで中身を切り替えています。

<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <data> <variable name="viewModel" type="com.dokoden.nr_tel.model.MainViewModel"/> </data> <androidx.coordinatorlayout.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <com.google.android.material.tabs.TabLayout android:id="@+id/tab_layout" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabIndicatorColor="?attr/colorPrimary" app:tabTextColor="@android:color/darker_gray"> <com.google.android.material.tabs.TabItem android:icon="@drawable/ic_dialpad_black_24dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <com.google.android.material.tabs.TabItem android:icon="@drawable/ic_access_time_black_24dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <com.google.android.material.tabs.TabItem android:icon="@drawable/ic_star_black_24dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <com.google.android.material.tabs.TabItem android:icon="@drawable/ic_comment_black_24dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </com.google.android.material.tabs.TabLayout> <androidx.fragment.app.FragmentContainerView android:id="@+id/tab_dialog_navi_host" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:navGraph="@navigation/tab_navigation" app:defaultNavHost="true"/> </LinearLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout> </layout>

試したこと

val hoge = binding.tabDialogNaviHost.findNavController()

をすると、1度目は正しくナビコントローラーが取れるが、2回目はNullで落ちます。
ここら辺が関係あるのですかね。

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

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

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

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

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

guest

回答1

0

自己解決

あきらめて、TabLayout+ViewPager2+カスタムDialogFragmentで対応したところ、うまく行きました

投稿2020/12/03 10:55

maccadoo

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問