微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

导航到另一个动态模块中的某些片段

如何解决导航到另一个动态模块中的某些片段

是否有任何方法可以导航到另一个动态模块中的某个片段,而不导航到起始目的地?如果没有,那还有什么选择?

<fragment
    android:id="@+id/loginFragment"
    android:name="com.example.feature.login.presentation.LoginFragment"
    android:label="LoginFragment">

    <action
        android:id="@+id/actionLoginToHome"
        app:destination="@id/featureHomeNavGraph" />

</fragment>

<include-dynamic
    android:id="@+id/featureHomeNavGraph"
    app:graphResName="feature_home_nav_graph"
    app:moduleName="feature_home" />

虽然此代码可以正常工作,但它可以将我导航到起始位置,但是我需要导航到另一个目标。

解决方法

解决方案1::导航至特定片段,不要使用<include-dynamic>

<fragment
    android:id="@+id/profileDetailsFragment"
    android:name="com.example.feature.profiles.presentation.details.ProfileDetailsFragment"
    android:label="Profile Details"
    app:moduleName="feature_profiles" />

解决方案2:创建具有不同起始目标的新图XML。

,

对嵌入式导航图执行此操作的一种好方法是使用空白的导航片段。您可以执行操作以转到此片段,然后将其参数发送给下一步导航。一些示例代码:

class NavigatorFragment : Fragment() {

    companion object {
        const val REQUEST_PAGE_NAME = "REQUEST_PAGE_NAME"

        const val PAGE_TYPE_ACTIVATE_CARD = "PAGE_TYPE_ACTIVATE_CARD"
        const val PAGE_TYPE_CREDIT_LIMIT = "PAGE_TYPE_CREDIT_LIMIT"
        const val PAGE_TYPE_SCC_HUB = "PAGE_TYPE_SCC_HUB"
        const val PAGE_TYPE_ABOUT_CARD = "about_card"
        const val PAGE_TYPE_MAKE_PAYMENT = "PAGE_TYPE_MAKE_PAYMENT"

        fun createBundle(pageName: String) =
            Bundle().apply {
                putString(REQUEST_PAGE_NAME,pageName)
            }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        when (arguments?.getString(REQUEST_PAGE_NAME)) {
            PAGE_TYPE_ACTIVATE_CARD -> 
                findNavController().navigate(R.id.to_activateSecuredCard)
        PAGE_TYPE_CREDIT_LIMIT -> 
                findNavController().navigate(R.id.to_creditLimit)
        PAGE_TYPE_ABOUT_CARD -> 
                findNavController().navigate(R.id.to_aboutSecuredCard,arguments)
        PAGE_TYPE_SCC_HUB -> 
                findNavController().navigate(R.id.to_sccHub)
        PAGE_TYPE_MAKE_PAYMENT -> 
                findNavController().navigate(R.id.to_sccMakePayment)
    }
}

override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {
    val binding: FragmentSecuredCardNavigatorBinding = DataBindingUtil.inflate(inflater,R.layout.fragment_secured_card_navigator,container,false)

    binding.lifecycleOwner = viewLifecycleOwner


    if (findNavController()
                 .currentDestination.toString()
                 .contains(this.javaClass.name)
        ){
        findNavController().popBackStack()
    }

        return binding.root
    }
}

主导航:

<?xml version="1.0" encoding="utf-8"?>
<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"
app:startDestination="@+id/home_dashboard_fragment">

<include app:graph="@navigation/nav_graph_secured_card" />
<!-- rest of navigation graph-->
.....
</navigation>

安全卡导航:

<?xml version="1.0" encoding="utf-8"?>
<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/nav_root_secured_card"
app:startDestination="@id/securedCardNavigator">

<fragment
    android:id="@+id/securedCardNavigator"
    android:name="com.greendotcorp.securedcard.fragment.NavigatorFragment">
    <action
        android:id="@+id/to_activateSecuredCard"
        app:destination="@+id/activateSecuredCard"

        app:popUpTo="@+id/securedCardNavigator"
        app:popUpToInclusive="true" />

</fragment>
</navigation>

导航到安全卡导航:

findNavController().navigate(R.id.nav_root_secured_card,NavigatorFragment.createBundle(NavigatorFragment.PAGE_TYPE_SCC_HUB))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。