Android 如何从片段管理底部导航?
我试图将navController设置为bottomNavigation,但它需要活动,问题是我的borromNavigation托管在片段中,所以我没有活动实例 我试过了Android 如何从片段管理底部导航?,android,android-fragments,bottomnavigationview,android-jetpack-navigation,Android,Android Fragments,Bottomnavigationview,Android Jetpack Navigation,我试图将navController设置为bottomNavigation,但它需要活动,问题是我的borromNavigation托管在片段中,所以我没有活动实例 我试过了 bottom_nav_view.setupWithNavController(findNavController()) 以及: home_fragment.xml: <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widg
bottom_nav_view.setupWithNavController(findNavController())
以及:
home_fragment.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".ui.fragments.home.HomeFragment">
<fragment
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/bottom_nav_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:id="@+id/my_nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
app:navGraph="@navigation/main_navigation"
app:defaultNavHost="true"
/>
<com.google.android.material.bottomnavigation.BottomNavigationView
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:id="@+id/bottom_nav_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:menu="@menu/bottom_menu" />
</androidx.constraintlayout.widget.ConstraintLayout>
bottom_menu.xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:icon="@drawable/ic_schedule"
android:id="@+id/scheduleFragment"
android:title="Schedule"/>
<item
android:icon="@drawable/ic_database"
android:id="@+id/archiveFragment"
android:title="Database"/>
<item
android:id="@+id/teachersFragment"
android:icon="@drawable/ic_teachers"
android:title="Teachers"/>
<item
android:id="@+id/settingsFragment"
android:icon="@drawable/ic_settings_"
android:title="Settings"/>
</menu>
main_navigation.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/main_navigation"
app:startDestination="@id/scheduleFragment">
<fragment
android:id="@+id/scheduleFragment"
android:name="andy.schedulekpi.ui.fragments.schedule.ScheduleFragment"
android:label="schedule_fragment"
tools:layout="@layout/schedule_fragment"/>
<fragment
android:id="@+id/archiveFragment"
android:name="andy.schedulekpi.ui.fragments.archive.ArchiveFragment"
android:label="archive_fragment"
tools:layout="@layout/archive_fragment"/>
<fragment
android:id="@+id/teachersFragment"
android:name="andy.schedulekpi.ui.fragments.teachers.TeachersFragment"
android:label="teachers_fragment"
tools:layout="@layout/teachers_fragment"/>
<fragment
android:id="@+id/settingsFragment"
android:name="andy.schedulekpi.ui.fragments.settings.SettingsFragment"
android:label="settings_fragment"
tools:layout="@layout/settings_fragment"/>
</navigation>
我本想从fragment处理bottomNavigation,但现在我单击了菜单项,没有发生任何问题或错误。在HomeFragment中,在BottomNavigationView上设置navController:
import androidx.navigation.findNavController
然后,当您想从底部导航视图获取导航控制器时:
bottom_nav_view.findNavController()
在HomeFragment中,在BottomNavigationView上设置navController:
import androidx.navigation.findNavController
然后,当您想从底部导航视图获取导航控制器时:
bottom_nav_view.findNavController()
如前所述,在onActivityCreated中的HomeFragment中,我只需要添加
bottom_nav_view.setupWithNavController(activity!!.findNavController(R.id.my_nav_host_fragment))
因此,现在在HomeFragment中,我有:
package andy.schedulekpi.ui.fragments.home
import androidx.lifecycle.ViewModelProviders
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.navigation.Navigation
import androidx.navigation.findNavController
import androidx.navigation.fragment.navArgs
import androidx.navigation.ui.setupWithNavController
import andy.schedulekpi.R
import kotlinx.android.synthetic.main.home_fragment.*
import kotlinx.android.synthetic.main.home_fragment.view.*
class HomeFragment : Fragment() {
companion object {
fun newInstance() = HomeFragment()
}
private lateinit var viewModel: HomeViewModel
val safeArgs : HomeFragmentArgs by navArgs()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.home_fragment, container, false)
return view
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProviders.of(this).get(HomeViewModel::class.java)
// TODO: Use the ViewModel
//Navigation.setViewNavController(bottom_nav_view, activity!!.findNavController(R.id.my_nav_host_fragment))
bottom_nav_view.setupWithNavController(activity!!.findNavController(R.id.my_nav_host_fragment))
Toast.makeText(this.context, safeArgs.currentWeek.toString(), Toast.LENGTH_SHORT).show()
}
}
多亏了 如前所述,在onActivityCreated中的HomeFragment中,我只需添加
bottom_nav_view.setupWithNavController(activity!!.findNavController(R.id.my_nav_host_fragment))
因此,现在在HomeFragment中,我有:
package andy.schedulekpi.ui.fragments.home
import androidx.lifecycle.ViewModelProviders
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.navigation.Navigation
import androidx.navigation.findNavController
import androidx.navigation.fragment.navArgs
import androidx.navigation.ui.setupWithNavController
import andy.schedulekpi.R
import kotlinx.android.synthetic.main.home_fragment.*
import kotlinx.android.synthetic.main.home_fragment.view.*
class HomeFragment : Fragment() {
companion object {
fun newInstance() = HomeFragment()
}
private lateinit var viewModel: HomeViewModel
val safeArgs : HomeFragmentArgs by navArgs()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.home_fragment, container, false)
return view
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProviders.of(this).get(HomeViewModel::class.java)
// TODO: Use the ViewModel
//Navigation.setViewNavController(bottom_nav_view, activity!!.findNavController(R.id.my_nav_host_fragment))
bottom_nav_view.setupWithNavController(activity!!.findNavController(R.id.my_nav_host_fragment))
Toast.makeText(this.context, safeArgs.currentWeek.toString(), Toast.LENGTH_SHORT).show()
}
}
多亏了 请注意,如果您的导航主机是FragmentContainerView,则此解决方案不起作用!这个解决方案有效。我在导航主机FragmentContainerView上以这种方式使用它。请注意,如果您的导航主机是FragmentContainerView,则此解决方案不起作用!这个解决方案有效。我在导航主机FragmentContainerView上以这种方式使用它。请注意,如果您的导航主机是FragmentContainerView,则此解决方案不起作用!请注意,如果您的导航主机是FragmentContainerView,则此解决方案不起作用!