- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用类似于示例应用的导航 UI 的 BottomNavigationView
和 FragmentContainerView
创建底部应用栏导航 NavigationAdavancedSample 。
请注意,NavigationAndvancedSample 应用似乎未使用与 documentation 中描述的相同实现因为它有一个使用自定义扩展方法 setupWithNavController
的解决方法实现。
在 MainActivity.kt 中使用 FragmentContainerView
创建 BottomNavigationView
时为 Null NavHostFragment
。
BottomNavigationViewSample 中提供了可重现的错误和完整的代码示例存储库。
2020-05-15 12:39:19.117 18747-18747/com.example.bottomnavigationviewsample E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.bottomnavigationviewsample, PID: 18747 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.bottomnavigationviewsample/com.example.bottomnavigationviewsample.MainActivity}: kotlin.TypeCastException: null cannot be cast to non-null type androidx.navigation.fragment.NavHostFragment at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) Caused by: kotlin.TypeCastException: null cannot be cast to non-null type androidx.navigation.fragment.NavHostFragment at com.example.bottomnavigationviewsample.MainActivity.onCreate(MainActivity.kt:16) at android.app.Activity.performCreate(Activity.java:7802) at android.app.Activity.performCreate(Activity.java:7791) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 2020-05-15 12:39:19.132 18747-18747/com.example.bottomnavigationviewsample I/Process: Sending signal. PID: 18747 SIG: 9
为第一个 View home.xml 创建一个导航图,以显示在 app > res > navigation 下的 BottomNavigationView
中.
一个。当提示添加项目依赖项时,选择确定。
将 kotlinOptions { jvmTarget = '1.8' }
添加到 build.gradle (:someAppModule) 以启用 AppBarConfiguration
的内联字节码。
将 fragment 添加到 home.xml 以显示在 BottomNavigationView
中。
home.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/home"
app:startDestination="@id/homeFragment">
<fragment
android:id="@+id/homeFragment"
android:name="com.example.bottomnavigationviewsample.HomeFragment"
android:label="fragment_home"
tools:layout="@layout/fragment_home" />
</navigation>
build.gradle
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 29
buildToolsVersion "29.0.3"
kotlinOptions { jvmTarget = '1.8' }
defaultConfig {
applicationId "com.example.bottomnavigationviewsample"
minSdkVersion 21
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.core:core-ktx:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation 'androidx.navigation:navigation-fragment-ktx:2.2.2'
implementation 'androidx.navigation:navigation-ui-ktx:2.2.2'
}
在 app > res > menu 下为 BottomNavigationView
创建一个菜单,bottom_nav.xml。
一个。为菜单 id
和 title
添加字符串值。
为菜单 icon
添加矢量可绘制对象。
bottom_nav.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/home"
android:icon="@drawable/ic_home_black_24dp"
android:contentDescription="@string/cd_home"
android:title="@string/title_home" />
</menu>
FragmentContainerView
和 BottomNavigationView
添加到 MainActivity.kt 的 activity_main.xml 布局。activity_main.xml
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/nav_host_container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_nav"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:menu="@menu/bottom_nav"/>
</LinearLayout>
在 MainActivity.kt 中启用 BottomNavigationView
。
一个。创建 AppBarConfiguration
。 参见:使用 NaviationUI 更新 UI 组件 > AppBarConfiguration
创建 NavHostFragment
和 NavController
。 参见:FragmentContainerView using findNavController 的 StackOverflow 解决方案
设置操作栏导航。
设置 BottomNavigationView
导航。 请参阅:使用 NavigationUI 更新 UI 组件 > Bottom navigation
MainActivity.kt
package com.example.bottomnavigationviewsample
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.setupActionBarWithNavController
import androidx.navigation.ui.setupWithNavController
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val appBarConfiguration = AppBarConfiguration(setOf(R.id.home))
val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_container) as NavHostFragment
val navController = navHostFragment.navController
setupActionBarWithNavController(navController, appBarConfiguration)
bottom_nav.setupWithNavController(navController)
}
}
使用 findNavController(R.id.nav_host_container)
创建 NavController
,如 documentation 中所述.
在 activity_main.xml 中实现 fragment
View 而不是 FragmentContainerView
。
activity_main.xml
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity">
<fragment
android:id="@+id/nav_host_container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_nav"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:menu="@menu/bottom_nav"/>
</LinearLayout>
最佳答案
我也遇到过这个问题。我的错误是我没有在导航文件中输入正确的导航标签 ID。请注意,ID 必须等于菜单项的 ID。
在导航文件(navigation/home.xml)中:
<navigation
android:id="@+id/home" ... >
在菜单文件(menu/bottom_nav.xml)中:
<item
android:id="@+id/home" ... />
关于android - 带有 FragmentContainerView 的空 NavHostFragment/NavController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61827683/
我正在运行 Android Studio 3.6.3,我正在尝试使用作为 Android Jetpack 一部分的新导航资源。我做了Navigation Codelab了解如何使用此功能。 在我的项目
我正在将 Android 的导航架构组件集成到我的应用中。我在将数据从 Activity 传递到 fragment 开头时遇到了一些问题,所以我遵循了这个答案:Navigation Architect
我目前正在将导航组件实现到我的应用程序中,但无论我做什么,似乎发现 NavHostFragment 都不起作用。 我已经尝试过、重建、失效和重新启动、更改名称以及更新我的 Android Studio
好像使用 FragmentContainerView不能开箱即用? 这是我使用 fragment-ktx:1.2.0-rc01 的代码我总是遇到这个错误: Caused by: java.lang.
我正在使用带有导航组件的单 Activity 多 fragment 。如何隐藏某些 fragment 的底部导航栏? 我尝试了以下方法: 通过数据绑定(bind)控制底部导航栏的可见性。(有缺陷) 在
目前我有以下场景:用户必须登录才能使用该应用程序。这意味着我使用了 2 个 nav_graphs,一个用于所有内容的主图,然后是一个嵌套的主页图,用于在您登录后查看 View 。 登录后,底部导航栏会
我有一个包含多个功能模块的应用程序,我想在我的主模块中使用单个 NavHostFragment 进行导航。 app | | | feature1 | featu
如果您对以下段落有理解困难,请查看我制作的流程图。 我目前正在制作一个带有 3 个顶级目的地的笔记应用程序。顶级目的地之一 (NotesList) 显示用户创建的笔记列表。 NotesList 有一个
我有这个带有导航组件的选项卡式 UI 和处理选项卡的 BottomNavigationView。我的用例涉及这些选项卡 fragment 之一,以拥有自己的 BottomNavigationView。
我的布局在底部有一个导航栏,主要内容在 NavHostFragment 内。现在 NavHostFragment 的底部隐藏在导航栏后面。我怎样才能解决这个问题? 这是 Activity 的主要布局:
我有一个 fragment ,我在其中定义了一个 NavHostFragment,如下所示: 当试图在 fragment 中调用 findNavController 方法时,它抛出了一个非法状态异常
我个人无法发现这个问题,但是 Firebase Crashlytics 上有很多这样的错误 我用 StackOverflow 尝试了所有答案,但没有任何帮助 我的 R.layout.activity_
我想在一个 Activity 中有三个 navHostFragments,它们都占用相同的空间,但每个都有不同的导航图。然后使用 fragment 管理器和底部导航栏,我想在需要时显示每一个(并隐藏其
我想尝试新的导航库。关注后this guideline我在运行时遇到错误: Caused by: android.view.InflateException: Binary XML file line
我试图在新的导航组件中找到一种方法,但我没有找到任何相关信息。 我的当前目的地是: mainHostFragment.findNavController().currentDestination 但我
我们有一个旧版应用程序,我们开始迁移到 Jetpack Compose。 该应用程序只有一个 Activity ,使用带有导航 XML 图的导航组件在 fragment 之间导航。 我们正在遵循这种方
预计 使用类似于示例应用的导航 UI 的 BottomNavigationView 和 FragmentContainerView 创建底部应用栏导航 NavigationAdavancedSampl
我的目标是通过复杂的导航架构(我想)以最佳方式理解和使用导航组件。 为了创建全局上下文,我使用了一个包含 5 个项目的主 BottomNavigationBar。对于fragment associat
我想知道 Navigation.findNavController(it) 和 NavHostFragment.findNavController(this) 之间的区别。基本上两者都在做同样的事情,
我有一个 Activity ,其中包含一个带有给定导航图(和经典子 fragment )的 NavHostFragment。我的子 fragment 可能会触发事件(通过接口(interface)声明
我是一名优秀的程序员,十分优秀!