前提・実現したいこと
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で落ちます。
ここら辺が関係あるのですかね。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。