#android #navigation #navigation-drawer #android-safe-args
Вопрос:
Я реализовал навигационный ящик с помощью компонента Android N avigation, который состоит из двух фрагментов
1.Фрагмент Дома
2.Фрагмент Продукта
Я создал еще один фрагмент поиска фрагмента в качестве глобального действия , в котором есть текст редактирования и кнопка.
Проблема :-
Из фрагмента поиска, когда я нажимаю на кнопку, он вернется к фрагменту дома с поисковым запросом в качестве безопасного аргумента, это работает нормально, но после получения аргумента в фрагменте дома, затем, когда я открою фрагмент продукта с помощью навигационного ящика и нажму кнопку «Назад», поисковый запрос снова будет отправлен в фрагмент дома
Мой Код :-
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>
Основная активность.тыс. т
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)
}
}
}
Фрагмент поиска.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)
}
}
}
Фрагмент продукта.кт
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)
}
}
}
заранее спасибо
Комментарии:
1. Это похоже на ожидаемое поведение backstack, поскольку начальный фрагмент является вашим начальным пунктом назначения, не могли бы вы подробнее рассказать об ожидаемом поведении?
2. По умолчанию, когда я открываю фрагмент home, он будет извлекать некоторые данные в зависимости от местоположения пользователя, и когда я выполняю операцию поиска, фрагмент home покажет результат на основе поискового запроса….после того, как я выполню поиск и перейду к фрагменту продукта и нажму «Назад», в основном я получаю результат поискового запроса, не основанный на местоположении пользователя
3. Если вам визуализировать стек переходов назад в результате навигационной было бы — Главная —> Поиск —> Главная (при запросе) —> продукта, так, естественно, назад нажмите оставит вас в предыдущее состояние дома фрагмент, вы можете изменить свой дизайн и использовать
popUpTo
в своем действии на продукт фрагмент так, что стек является домом —> Поиск —> продукт