Ada*_*itz 5 android android-fragments android-navigation android-architecture-navigation android-bottomappbar
使用导航 UI 创建底部应用程序栏导航BottomNavigationView,FragmentContainerView类似于示例应用程序NavigationAdvancedSample。
请注意,NavigationAndvancedSample应用程序似乎没有使用文档中描述的相同实现,因为它有一个使用自定义扩展方法的解决方法实现setupWithNavController。
使用.在MainActivity.ktNavHostFragment中创建 时为 Null 。BottomNavigationViewFragmentContainerView
可重现的错误和完整的代码示例可在BottomNavigationViewSample存储库中找到。
\n\n\n\n\n2020-05-15 12:39:19.117 18747-18747/com.example.bottomnavigationviewsample E/AndroidRuntime: 致命异常: main\n 进程: com.example.bottomnavigationviewsample, PID: 18747\n java.lang.RuntimeException: 无法启动活动 ComponentInfo{com.example.bottomnavigationviewsample/com.example.bottomnavigationviewsample.MainActivity}:kotlin.TypeCastException:null 无法转换为非 null 类型 androidx.navigation.fragment.NavHostFragment\n 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)\n 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)\n 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java :83)\n 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)\n 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)\n 在 android.app.ActivityThread$ H.handleMessage(ActivityThread.java:2016)\n 在 android.os.Handler.dispatchMessage(Handler.java:107)\n 在 android.os.Looper.loop(Looper.java:214)\n 在 android.app .ActivityThread.main(ActivityThread.java:7356)\n 在 java.lang.reflect.Method.invoke(本机方法)\n 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) \n 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)\n 导致:kotlin.TypeCastException: null 无法转换为非空类型 androidx.navigation.fragment.NavHostFragment\n 在 com .example.bottomnavigationviewsample.MainActivity.onCreate(MainActivity.kt:16)\n 在 android.app.Activity.performCreate(Activity.java:7802)\n 在 android.app.Activity.performCreate(Activity.java:7791)\ n 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)\n 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)\n 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) \xc2\xa0\n 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)\xc2\xa0\n 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)\xc2\xa0 \n 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)\xc2\xa0\n 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)\xc2\xa0\n 在 android .os.Handler.dispatchMessage(Handler.java:107)\xc2\xa0\n 在 android.os.Looper.loop(Looper.java:214)\xc2\xa0\n 在 android.app.ActivityThread.main(ActivityThread .java:7356)\xc2\xa0\n 在 java.lang.reflect.Method.invoke(本机方法)\xc2\xa0\n 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java: 492)\xc2\xa0\n 位于 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)\xc2\xa0\n 2020-05-15 12:39:19.132 18747-18747/com.example .bottomnavigationviewsample I/Process:发送信号。PID:18747 SIG:9
\n
为第一个视图home.xml创建导航图,以显示在app > res > navigationBottomNavigationView下。
A。当提示添加项目依赖项时,选择“确定”。
\n\nb. 添加kotlinOptions { jvmTarget = \'1.8\' }到build.gradle (:someAppModule)以启用AppBarConfiguration.
C。将片段添加到home.xml以显示在BottomNavigationView.
主页.xml
\n\n<?xml version="1.0" encoding="utf-8"?>\n<navigation xmlns:android="http://schemas.android.com/apk/res/android"\n xmlns:app="http://schemas.android.com/apk/res-auto"\n xmlns:tools="http://schemas.android.com/tools"\n android:id="@+id/home"\n app:startDestination="@id/homeFragment">\n\n <fragment\n android:id="@+id/homeFragment"\n android:name="com.example.bottomnavigationviewsample.HomeFragment"\n android:label="fragment_home"\n tools:layout="@layout/fragment_home" />\n</navigation>\nRun Code Online (Sandbox Code Playgroud)\n\n构建.gradle
\n\napply plugin: \'com.android.application\'\napply plugin: \'kotlin-android\'\napply plugin: \'kotlin-android-extensions\'\n\nandroid {\n compileSdkVersion 29\n buildToolsVersion "29.0.3"\n\n kotlinOptions { jvmTarget = \'1.8\' }\n\n defaultConfig {\n applicationId "com.example.bottomnavigationviewsample"\n minSdkVersion 21\n targetSdkVersion 29\n versionCode 1\n versionName "1.0"\n\n testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"\n }\n\n buildTypes {\n release {\n minifyEnabled false\n proguardFiles getDefaultProguardFile(\'proguard-android-optimize.txt\'), \'proguard-rules.pro\'\n }\n }\n\n}\n\ndependencies {\n implementation fileTree(dir: \'libs\', include: [\'*.jar\'])\n implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"\n implementation \'androidx.appcompat:appcompat:1.1.0\'\n implementation \'androidx.core:core-ktx:1.2.0\'\n implementation \'androidx.constraintlayout:constraintlayout:1.1.3\'\n testImplementation \'junit:junit:4.12\'\n androidTestImplementation \'androidx.test.ext:junit:1.1.1\'\n androidTestImplementation \'androidx.test.espresso:espresso-core:3.2.0\'\n implementation \'androidx.navigation:navigation-fragment-ktx:2.2.2\'\n implementation \'androidx.navigation:navigation-ui-ktx:2.2.2\'\n}\n\nRun Code Online (Sandbox Code Playgroud)\n\n在app > res > menu下为bottom_nav.xml创建BottomNavigationView一个菜单。
A。添加菜单id和的字符串值title。
b. 为菜单添加矢量绘图icon。
底部导航.xml
\n\n<?xml version="1.0" encoding="utf-8"?>\n<menu xmlns:android="http://schemas.android.com/apk/res/android">\n <item\n android:id="@+id/home"\n android:icon="@drawable/ic_home_black_24dp"\n android:contentDescription="@string/cd_home"\n android:title="@string/title_home" />\n</menu>\nRun Code Online (Sandbox Code Playgroud)\n\nFragmentContainerView将和添加BottomNavigationView到MainActivity.kt的Activity_main.xml布局中。活动主文件
\n\n<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"\n xmlns:app="http://schemas.android.com/apk/res-auto"\n xmlns:tools="http://schemas.android.com/tools"\n android:layout_width="match_parent"\n android:layout_height="match_parent"\n android:orientation="vertical"\n tools:context=".MainActivity">\n\n <androidx.fragment.app.FragmentContainerView\n android:id="@+id/nav_host_container"\n android:layout_width="match_parent"\n android:layout_height="0dp"\n android:layout_weight="1" />\n\n <com.google.android.material.bottomnavigation.BottomNavigationView\n android:id="@+id/bottom_nav"\n android:layout_width="match_parent"\n android:layout_height="wrap_content"\n app:menu="@menu/bottom_nav"/>\n</LinearLayout>\nRun Code Online (Sandbox Code Playgroud)\n\nBottomNavigationView在MainActivity.kt中启用。
A。创造AppBarConfiguration。请参阅:使用 NaviationUI > AppBarConfiguration更新 UI 组件
b. 创建NavHostFragment和NavController。请参阅:使用 findNavController 的 FragmentContainerView的 StackOverflow 解决方案
C。设置操作栏导航。
\n\nd. 设置BottomNavigationView导航。请参阅:使用 NavigationUI >底部导航更新 UI 组件
MainActivity.kt
\n\npackage com.example.bottomnavigationviewsample\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.navigation.fragment.NavHostFragment\nimport androidx.navigation.ui.AppBarConfiguration\nimport androidx.navigation.ui.setupActionBarWithNavController\nimport androidx.navigation.ui.setupWithNavController\nimport kotlinx.android.synthetic.main.activity_main.*\n\nclass MainActivity : AppCompatActivity() {\n\n override fun onCreate(savedInstanceState: Bundle?) {\n super.onCreate(savedInstanceState)\n setContentView(R.layout.activity_main)\n val appBarConfiguration = AppBarConfiguration(setOf(R.id.home))\n\n val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_container) as NavHostFragment\n val navController = navHostFragment.navController\n\n setupActionBarWithNavController(navController, appBarConfiguration)\n bottom_nav.setupWithNavController(navController)\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n按照文档中的概述创建NavControllerwith 。findNavController(R.id.nav_host_container)
实现一个fragment视图而不是FragmentContainerView在Activity_main.xml中。
活动主文件
\n\n<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"\n xmlns:app="http://schemas.android.com/apk/res-auto"\n xmlns:tools="http://schemas.android.com/tools"\n android:layout_width="match_parent"\n android:layout_height="match_parent"\n android:orientation="vertical"\n tools:context=".MainActivity">\n\n <fragment\n android:id="@+id/nav_host_container"\n android:layout_width="match_parent"\n android:layout_height="0dp"\n android:layout_weight="1" />\n\n <com.google.android.material.bottomnavigation.BottomNavigationView\n android:id="@+id/bottom_nav"\n android:layout_width="match_parent"\n android:layout_height="wrap_content"\n app:menu="@menu/bottom_nav"/>\n</LinearLayout>\nRun Code Online (Sandbox Code Playgroud)\n
BottomNavigationView。完整的示例代码包含在BottomNavigationSample中。
这可以通过每个菜单项的一个父导航图和片段或嵌套导航图来完成。嵌套导航图很好,因为每个子流都可以在嵌套图中组织。
主文件
<?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/main"
app:startDestination="@id/home">
<include app:graph="@navigation/home" />
<include app:graph="@navigation/saved" />
</navigation>
Run Code Online (Sandbox Code Playgroud)
navGraph添加使用在 中的父图FragmentContainerView。活动主文件
<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:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
app:defaultNavHost="true"
app:navGraph="@navigation/main"/>
<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>
Run Code Online (Sandbox Code Playgroud)
BottomNavigationView在MainActivity.kt中启用。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, R.id.saved))
val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_container) as NavHostFragment
val navController = navHostFragment.navController
setupActionBarWithNavController(navController, appBarConfiguration)
bottom_nav.setupWithNavController(navController)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6442 次 |
| 最近记录: |