【问题标题】:Navigate to certain fragment from another dynamic module从另一个动态模块导航到某个片段
【发布时间】:2020-10-09 18:41:28
【问题描述】:

有没有办法从另一个动态模块导航到某个片段而不导航到起始目的地?如果没有,有什么替代方案?

<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" />

虽然此代码运行良好,但它会将我导航到起始目的地,但我需要导航到另一个目的地。

【问题讨论】:

    标签: android android-navigation multi-module


    【解决方案1】:

    解决方案1:导航到特定片段,不要使用&lt;include-dynamic&gt;

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

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

    【讨论】:

      【解决方案2】:

      为嵌入式导航图执行此操作的一个好方法是使用空白导航片段。你得到你的动作去这个片段,然后向它发送关于下一步导航的参数。一些示例代码:

      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))
      

      【讨论】:

        猜你喜欢
        • 2013-12-19
        • 2013-05-12
        • 1970-01-01
        • 2021-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-02
        相关资源
        最近更新 更多