导航抽屉上的导航组件安全参数问题

时间:2021-05-26 12:46:07

标签: android navigation navigation-drawer android-safe-args

我已经使用 Android N导航组件实现了导航抽屉,它有两个片段

1.首页片段

2.产品片段

我创建了另一个片段搜索片段作为全局操作,它具有编辑文本和一个按钮

问题:-

搜索片段当我点击一个按钮时,它会返回到Home Fragment with search query as safe argument,这工作正常,但在Home Fragment中接收到参数后然后当我使用导航抽屉打开产品片段并按后退按钮时,搜索查询将再次发送到主页片段强>

我的代码:-

nav_graph.xml

<?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_graph"
   app:startDestination="@id/homeFragment">

   <fragment
       android:id="@+id/homeFragment"
       android:name="com.example.navigation.HomeFragment"
       android:label="fragmnet_home"
       tools:layout="@layout/fragmnet_home">
         <argument
           android:name="query"
           app:argType="string"
           app:nullable="true"
           android:defaultValue="@null" />
   </fragment>

   <fragment
       android:id="@+id/searchFragment"
       android:name="com.example.navigation.SearchFragment"
       android:label="fragment_search"
       tools:layout="@layout/fragment_search" >
       <action
           android:id="@+id/action_searchFragment_to_homeFragment"
           app:destination="@id/homeFragment" />
   </fragment>

   <action android:id="@+id/action_global_searchFragment" app:destination="@id/searchFragment" />
   <fragment
       android:id="@+id/productFragment"
       android:name="com.example.navigation.ProductFragment"
       android:label="fragment_product"
       tools:layout="@layout/fragment_product" />
 </navigation>

MainActivity.kt

class MainActivity : AppCompatActivity() {

   private lateinit var mainBinding : ActivityMainBinding
   private lateinit var mNavController : NavController
   private lateinit var appBarConfiguration: AppBarConfiguration
   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       mainBinding = ActivityMainBinding.inflate(layoutInflater)
       setContentView(mainBinding.root)

       appBarConfiguration = AppBarConfiguration(
        setOf(R.id.homeFragment),
        mainBinding.drawerLayout
    )
       val navHost = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
       mNavController = navHost.findNavController()
       setSupportActionBar(mainBinding.toolbar)
       setupActionBarWithNavController(mNavController,appBarConfiguration)
       mainBinding.navView.setupWithNavController(mNavController)
   }

   override fun onSupportNavigateUp(): Boolean {
       return mNavController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
   }
 }

HomeFragment.kt

class HomeFragment : Fragment(R.layout.fragmnet_home) {

    private lateinit var homeBinding  : FragmnetHomeBinding
    private val arguments : HomeFragmentArgs by navArgs()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        homeBinding = FragmnetHomeBinding.bind(view)

    
        if(!arguments.query.isNullOrEmpty()){
            Toast.makeText(context, "${arguments.query}", Toast.LENGTH_SHORT).show()
        }
    
        homeBinding.btnSearch.setOnClickListener {
            val destination = HomeFragmentDirections.actionGlobalSearchFragment()
            findNavController().navigate(destination)
        }
    }
}

SearchFragment.kt

class SearchFragment : Fragment() {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val binding = FragmentSearchBinding.bind(view)
    
        binding.search.setOnClickListener {
            val query = binding.query.text.toString()
            val action = SearchFragmentDirections.actionSearchFragmentToHomeFragment(query)
            findNavController().navigate(action)

        }

    }
}

ProductFragment.kt

class ProductFragment : Fragment(R.layout.fragment_product) {

    private lateinit var productBinding  : FragmentProductBinding

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        productBinding = FragmentProductBinding.bind(view)
    
        productBinding.btnSearch.setOnClickListener {
            val action  = ProductFragmentDirections.actionGlobalSearchFragment()
            findNavController().navigate(action)
        }
    }
}

nav_graph image

提前致谢

0 个答案:

没有答案