Я использую навигацию на реактивном ранце в двух разных действиях, каждое со своим навигационным хостом. У меня есть основное действие, которое все работает нормально, и действие настройки, в котором есть 2 фрагмента, у одного есть кнопка, которая должна переходить к другому фрагменту при нажатии.
Код активности следующий:
class SetupActivity : AppCompatActivity() {
private val navController by lazy { findNavController(R.id.nav_host_fragment) }
private lateinit var appBarConfig: AppBarConfiguration
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
DataBindingUtil.setContentView<ActivitySetupBinding>(this, R.layout.activity_setup)
setSupportActionBar(toolbar)
appBarConfig = AppBarConfiguration(navController.graph)
setupActionBarWithNavController(navController, appBarConfig)
}
override fun onSupportNavigateUp(): Boolean {
return navController.navigateUp(appBarConfig) || super.onSupportNavigateUp()
}
}
Ниже приведен xml активности:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".ui.SetupActivity"
tools:showIn="@layout/activity_setup">
<fragment
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/setup" />
</androidx.constraintlayout.widget.ConstraintLayout>
Ниже приведен код первого фрагмента, который также является начальной точкой назначения.
class ConfirmClassFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val binding = FragmentConfirmClassBinding.inflate(inflater, container, false)
binding.fragment = this
return binding.root
}
fun navigate() {
toast("clicked") //this get called
val direction = ConfirmClassFragmentDirections.actionConfirmToSetup()
findNavController().navigate(direction) //THE PROBLEM IS HERE
//findNavController().navigate(R.id.setup)
}
}
Я использую привязку данных для вызова fun navigate()
, как показано ниже:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="fragment"
type="com.nux.ui.fragments.ConfirmClassFragment" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="@dimen/spacing_middle">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{() -> fragment.navigate()}"
android:text="@string/continue_" />
</LinearLayout>
</layout>
и вот как выглядит навигационный 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/setup"
app:startDestination="@id/confirm">
<fragment
android:id="@+id/setup"
android:name="com.nux.ui.fragments.SetInfoFragment"
android:label="@string/setup"
tools:layout="@layout/fragment_set_info" />
<fragment
android:id="@+id/confirm"
android:name="com.nux.ui.fragments.ConfirmClassFragment"
android:label="@string/data_confirmation"
tools:layout="@layout/fragment_confirm_class">
<action
android:id="@+id/action_confirm_to_setup"
app:destination="@id/setup" />
</fragment>
</navigation>
Когда я нажимаю кнопку, вызывается веселье, но ничего не происходит! Что могло быть не так?