【问题标题】:Convert Fragment to Dialog Fragment with navArgs, How to navigate to DialogFragment from outside the Fragment class使用 navArgs 将 Fragment 转换为 DialogFragment,如何从 Fragment 类外部导航到 DialogFragment
【发布时间】:2022-01-21 00:52:13
【问题描述】:

我想导航DetailsFragment单击列表项(book_item.xml)

book_item.xml

<LinearLayout 
        ...
        onBooksClickListener="@{result}">
... 
</LinearLayout>

现在它适用于 片段(全屏)

我想让它覆盖片段所以想把它转换成对话框片段

片段

的工作代码

片段类

class DetailsFragment : Fragment() {
 private val args by navArgs<DetailsFragmentArgs>()
 override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?): View? {
    val view = inflater.inflate(R.layout.fragment_details, container, false)
    }
 }

RowBinding 类

class BooksRowBinding  {
    companion object {

        @ExperimentalCoroutinesApi
        @BindingAdapter("onBooksClickListener")
        @JvmStatic
        fun onBooksClickListener(linearLayout: LinearLayout, result: Result){
            linearLayout.setOnClickListener{
                try {
                    val action = BooksListFragmentDirections.actionBooksListFragmentToDetailsFragment(result)
                    linearLayout.findNavController().navigate(action)

                    }catch (e: Exception){
                    Log.d("OnBooksClickListener",e.toString())
                }
            }
        }

要将其转换为 DailogFragment,我尝试使用 google android 文档,但没有说明如何从 Fragment 类外部打开 dialogFragment

DialogFragment

的代码损坏

片段类

class DetailsFragment : DailogFragment() {
 private val args by navArgs<DetailsFragmentArgs>()
 override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?): View? {
    val view = inflater.inflate(R.layout.fragment_details, container, false)
    }
 }

 

RowBinding 类

class BooksRowBinding  {
    companion object {

        @ExperimentalCoroutinesApi
        @BindingAdapter("onBooksClickListener")
        @JvmStatic
        fun onBooksClickListener(linearLayout: LinearLayout, result: Result){
            linearLayout.setOnClickListener{
                try {
                    DetailsFragment().show(childFragmentManager,DetailsFragment.TAG) 
                   /****************ERROR *******************
                    this works only if you call this from within the 
                    onCreateMethod of the Fragment
                   ******************************************/
                    }catch (e: Exception){
                    Log.d("OnBooksClickListener",e.toString())
                }
            }
        }

现在我遇到错误:Unresolved reference: childFragmentManager

my_nav.xml

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/my_nav"
    app:startDestination="@id/booksListFragment">
    <fragment
        android:id="@+id/booksListFragment"
        android:name="we.are.suvikranth.ui.BooksListFragment"
        android:label="Suvikranth"
        tools:layout="@layout/fragment_books_list">
        
        <action
         android:id="@+id/action_booksListFragment_to_detailsFragment"
            app:destination="@id/detailsFragment" />
    </fragment>
    <fragment 
        android:id="@+id/detailsFragment"
        android:name="we.are.suvikranth.ui.DetailsFragment"
        android:label="Books Details"
        tools:layout="@layout/fragment_details" >
        <argument
            android:name="result"
            app:argType="we.are.suvikranth.models.Result" />
    </fragment>
</navigation>

【问题讨论】:

  • 如果您使用的是 Navigation,则不应直接自己创建 DialogFragment。您没有使用dialog destination 有什么原因吗?
  • @ianhanniballake 感谢您的回复,因为谷歌文档中没有提供 developer.android.com/guide/fragments/dialogs
  • @ianhanniballake 谢谢你。我之前在做完整片段时使用了导航图(对话目的地)。我重用了它并将 nav.xml Fragment 组件更改为对话框组件

标签: android android-fragments android-dialogfragment android-navigation dialogfragment


【解决方案1】:

使用前面的代码导航到对话框片段

但在 my_nav.xml 中将片段更改为对话框

现在 RowBinding 类 看起来像

class BooksRowBinding  {
    companion object {

        @ExperimentalCoroutinesApi
        @BindingAdapter("onBooksClickListener")
        @JvmStatic
        fun onBooksClickListener(linearLayout: LinearLayout, result: Result){
            linearLayout.setOnClickListener{
                try {
                    val action = BooksListFragmentDirections.actionBooksListFragmentToDetailsFragment(result)
                    linearLayout.findNavController().navigate(action)

                    }catch (e: Exception){
                    Log.d("OnBooksClickListener",e.toString())
                }
            }
        }

my_nav.xml 看起来像

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/my_nav"
    app:startDestination="@id/booksListFragment">
    <fragment
        android:id="@+id/booksListFragment"
        android:name="we.are.suvikranth.ui.BooksListFragment"
        android:label="Suvikranth"
        tools:layout="@layout/fragment_books_list">
        
        <action
         android:id="@+id/action_booksListFragment_to_detailsFragment"
            app:destination="@id/detailsFragment" />
    </fragment>
    <dialog
        android:id="@+id/detailsFragment"
        android:name="we.are.suvikranth.ui.DetailsFragment"
        android:label="Books Details"
        tools:layout="@layout/fragment_details" >
        <argument
            android:name="result"
            app:argType="we.are.suvikranth.models.Result" />
    </dialog>
</navigation>

【讨论】:

    猜你喜欢
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 2019-05-20
    相关资源
    最近更新 更多