我正在尝试使用导航控制器。我有一个底部导航视图。位于我的 MainActivity 上,它是使用以下代码启动的:
class MainActivity : AppCompatActivity() {
lateinit var navController : NavController
lateinit var logoHeaderImageView : ImageView
var toolbarMenu : Menu? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
logoHeaderImageView = findViewById(R.id.header_lakuin_image_view)
navController = Navigation.findNavController(this,R.id.nav_main_host_fragment)
setupBottomNavMenu(navController)
setupActionBar(navController)
}
fun setupBottomNavMenu(navController: NavController) {
NavigationUI.setupWithNavController(bottom_navigation_view,navController)
}
fun setupActionBar(navController: NavController) {
setSupportActionBar(main_activity_toolbar)
main_activity_toolbar.title = ""
val appBarConfiguration = AppBarConfiguration(
setOf(
// set some destination as the top hierarchy destination, to make the up button doesn't show.
R.id.destination_home,
R.id.destination_order,
R.id.destination_favourite,
R.id.destination_cart,
R.id.destination_profile …Run Code Online (Sandbox Code Playgroud) android android-navigation android-architecture-components android-jetpack android-architecture-navigation
我是使用 Android 导航控制器的新手。
这是我的主要活动的 xml:
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Activities.MainActivity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/main_activity_toolbar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:elevation="4dp" app:layout_constraintHorizontal_bias="0.0">
</androidx.appcompat.widget.Toolbar>
<fragment
android:id="@+id/nav_main_host_fragment"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="parent"
app:layout_constraintTop_toBottomOf="@+id/main_activity_toolbar"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:name="androidx.navigation.fragment.NavHostFragment"
app:navGraph="@navigation/main_graph"
app:defaultNavHost="true"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)
我的 kotlin 主要活动:
class MainActivity : AppCompatActivity(),NavController.OnDestinationChangedListener {
lateinit var navController : NavController
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
navController = Navigation.findNavController(this,R.id.nav_main_host_fragment)
navController.addOnDestinationChangedListener(this)
setupActionBar()
}
override fun onDestinationChanged(
controller: NavController,
destination: NavDestination,
arguments: Bundle?) {
}
private fun setupActionBar() {
setSupportActionBar(main_activity_toolbar)
supportActionBar?.title …Run Code Online (Sandbox Code Playgroud) android android-navigation android-architecture-components android-jetpack android-architecture-navigation
我有如下图所示的登录过程:
用户将使用以下代码从登录屏幕(中间)导航到更改密码屏幕(右侧):
val changePassword = LoginUsingEmailFragmentDirections.actionToChangePasswordFragment()
Navigation.findNavController(fragmentView).navigate(changePassword)
Run Code Online (Sandbox Code Playgroud)
我想如果用户成功更改密码,我想让用户以编程方式返回登录屏幕。
如果我使用使用大量活动的旧方式导航,那么我通常使用 finish()
我有点困惑什么是实现这一目标的正确方法。我是否需要先在图表中采取行动,然后使用与上面类似的代码?或者有没有更方便或更好的方法来做到这一点?
android android-navigation android-jetpack android-architecture-navigation
假设我在底部导航视图中有 4 个选项卡。如果用户选择这些选项卡之一,那么用户将从一个片段导航到其他片段。
假设用户选择第一个选项卡(主页),然后从以下位置导航:
片段A(主目录) -> 片段B -> 片段C -> 片段D -> 片段E
我想使用Android中的导航控制器组件以编程方式从fragmentE返回到fragmentA。怎么做 ?
我尝试过使用这段代码,但它只是返回到fragmentD(形成fragmentE)
btn.setOnClickListener{
Navigation.findNavController(view).navigateUp()
}
Run Code Online (Sandbox Code Playgroud) android android-navigation android-jetpack android-architecture-navigation
我正在实现 NavigationComponent 和一个 BottomNavigationView,我注意到工具栏中显示了所有片段目的地的后退箭头,但startDestination在我的导航图中指定为 的除外。
我能够找到的此实现的所有示例都显示出类似的行为。在我看来,为 BottomNavigationView 的每个相关片段隐藏后退箭头似乎是一种更自然的设计,(点击工具栏中的后退箭头从选项卡 2 导航到选项卡 1 对我来说感觉很奇怪,我以前从未见过这种情况) .
有关示例以及我希望实现的目标,请参见下图。有什么办法可以做到这一点吗?
android android-navigation android-toolbar android-jetpack android-jetpack-navigation
真的有必要打电话吗
override fun onSupportNavigateUp() = findNavController(R.id.nav_host_fragment).navigateUp()
Run Code Online (Sandbox Code Playgroud)
在我的 MainActivity 中?
因为当我在我的 xml 中附加 NavHostFragment 时,它从那里开始,但是我看过 Google I/O 讲座,他们使用它来作为导航的起点
我的问题
哪里有必要使用它?
谢谢
android android-fragments kotlin android-navigation android-architecture-navigation
是否可以在每个片段都有自己的工具栏的单个活动应用程序中使用 Android 导航组件/图形?
此外,容器活动有一个导航抽屉,需要设置工具栏和导航控制器,但在活动创建时我还没有工具栏。
我正在使用此代码(在 onCreate 中调用)
private fun setupNavigation() {
// val toolbar = findViewById<Toolbar>(R.id.toolbar);
// setSupportActionBar(toolbar);
// supportActionBar!!.setDisplayHomeAsUpEnabled(true);
// supportActionBar!!.setDisplayShowHomeEnabled(true);
val drawerLayout = findViewById<DrawerLayout>(R.id.drawer_layout);
val navigationView = findViewById<NavigationView>(R.id.drawer_navigation_view);
val navController = Navigation.findNavController(this, R.id.navigation_host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)
NavigationUI.setupWithNavController(navigationView, navController)
navigationView.setNavigationItemSelectedListener(this)
}
Run Code Online (Sandbox Code Playgroud)
但是由于我当时没有工具栏,它会引发错误(在空对象上调用 ActionBar.setTitle)。
是否有可能有这个,或者我需要放弃在这种情况下使用导航组件的想法?
android navigation-drawer android-navigation android-navigationview android-architecture-navigation
我曾尝试阅读此内容,但它并没有解决我的问题
所以我使用此代码导航到下一个目的地
val nextDirection = CreateEventNameFragmentDirections.actionToCreateEventType(userKM, newEvent)
findNavController().navigate(nextDirection)
Run Code Online (Sandbox Code Playgroud)
但它在我错误旋转设备后崩溃
java.lang.IllegalStateException: 没有当前导航节点
我用这个更新gradle
Run Code Online (Sandbox Code Playgroud)implementation 'android.arch.navigation:navigation-fragment-ktx:2.2.1' implementation 'android.arch.navigation:navigation-ui-ktx:2.2.1'
但它仍然不起作用,它仍然崩溃。我该怎么办 ?这是我的主要活动
class MainActivity : AppCompatActivity(), NavController.OnDestinationChangedListener {
private lateinit var navController : NavController
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Initial Setup views
navController = Navigation.findNavController(this,R.id.nav_host_fragment)
setupBottomNavMenu()
setupActionBar()
// Add Listeners
navController.addOnDestinationChangedListener(this)
}
private fun setupBottomNavMenu() {
bottom_nav.setupWithNavController(navController)
}
private fun setupActionBar() {
generalToolbar.title = ""
searchToolbar.title = ""
searchWithBackButtonToolbar.title = ""
// set up top hierarchy destination
val appBarConfiguration …Run Code Online (Sandbox Code Playgroud) android android-navigation android-architecture-components android-architecture-navigation android-jetpack-navigation
我正在尝试做什么
我正在使用 Android 导航组件来处理我的应用程序中的导航。在此示例中,我有两个屏幕,屏幕 A 和屏幕 B。我希望用户能够单击屏幕 A 中的按钮并能够导航到屏幕 B;然后无法返回到上一屏幕(屏幕 A)。
问题
当用户从屏幕 A 导航到屏幕 B 时,操作栏上的后退按钮仍然允许用户返回上一屏幕,但是当单击底部栏中的后退按钮时,它会退出应用程序,因此这部分工作正常。
我需要做什么才能删除操作栏中的后退按钮?
到目前为止我读过的内容
我已遵循这三篇文章中的指导,但我认为他们可能忽略了ActionBar后退按钮:
我的代码
导航图 - 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"
android:id="@+id/nav_graph"
app:startDestination="@id/screen_a">
<fragment
android:id="@+id/screen_a"
android:name="com.example.conditionalnavigation.AFragment"
android:label="screen A">
<action
android:id="@+id/action_AFragment_to_BFragment"
app:destination="@id/screen_b"
app:launchSingleTop="true"
app:popUpTo="@id/screen_a"
app:popUpToInclusive="true" />
</fragment>
<fragment
android:id="@+id/screen_b"
android:name="com.example.conditionalnavigation.BFragment"
android:label="screen B" />
</navigation>
Run Code Online (Sandbox Code Playgroud)
MainActivity - 这充当我的单一活动导航主机。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) { …Run Code Online (Sandbox Code Playgroud) android kotlin back-stack android-navigation android-jetpack-navigation
我试图ArrayList<String>在使用 safeArgs 时将 an作为参数传递。但是当我从可序列化和构建的列表中选择 ArrayList 时,它向我抛出这些异常
One type argument expected for class ArrayList<E : Any!>
One type argument expected. Use 'ArrayList<*>' if you don't want to pass type arguments
Run Code Online (Sandbox Code Playgroud)
我知道我必须为 ArrayList 设置数据类型,但在从导航图屏幕设置 safeArgs 时,我无法这样做,也没有选项。
在导航图 XML 中,代码生成为
<argument
android:name="teamsToAdd"
app:argType="java.util.ArrayList" />
Run Code Online (Sandbox Code Playgroud)
有没有办法在导航图的 XML 中声明 dataType?
android kotlin android-navigation android-safe-args android-navigation-graph
android ×10
android-architecture-navigation ×7
android-architecture-components ×3
kotlin ×3
back-stack ×1