android - kotlin.TypeCastException:null 不能转换为非 null 类型 android.support.design.widget.FloatingActionButton
问题描述
我知道这已被问过很多次,但我真的无法理解为什么我无法在 TabLayout 的片段之一中添加浮动操作按钮。
它给了我错误,因为我的 logcat 中的“kotlin.TypeCastException:null 不能转换为非 null 类型 android.support.design.widget.FloatingActionButton”。
我是 android 和应用程序开发的新手,非常感谢这里的帮助,因为我已经浪费了 3 天
主要活动代码:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val fab = findViewById<View>(R.id.fab) as FloatingActionButton
fab.setOnClickListener { view ->
Snackbar.make(view, "Replace with your own action",
Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
}
initToolbar()
val tabLayout: TabLayout = findViewById(R.id.tab_layout)
val viewPager: ViewPager = findViewById(R.id.view_pager)
val adapter = SampleAdapter(supportFragmentManager)
viewPager.adapter = adapter
tabLayout.setupWithViewPager(viewPager)
tabLayout.addOnTabSelectedListener(object :
TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab) {
}
override fun onTabUnselected(tab: TabLayout.Tab) {
}
override fun onTabReselected(tab: TabLayout.Tab) {
}
})
}
private fun initToolbar() {
val toolbar: Toolbar = findViewById(R.id.toolbar)
setSupportActionBar(toolbar)
supportActionBar!!.title = "Don't Forget"
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:contentInsetStartWithNavigation="0dp"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
style="@style/CustomTabLayout"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:layout_gravity="left"
android:background="@color/colorPrimary"
app:tabGravity="fill"
app:tabMode="fixed"
app:tabTextAppearance="@style/TextAppearance.AppCompat" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</android.support.design.widget.CoordinatorLayout>
日志猫:
java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.ashwinis.mylistapp/com.ashwinis.mylistapp.MainActivity}:
kotlin.TypeCastException: null cannot be cast to non-null type
android.support.design.widget.FloatingActionButton
at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: kotlin.TypeCastException: null cannot be cast to non-null type
android.support.design.widget.FloatingActionButton
at com.ashwinis.mylistapp.MainActivity.onCreate(MainActivity.kt:25)
at android.app.Activity.performCreate(Activity.java:6975)
at
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
fragment_one.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">
<TextView
android:layout_width="match_parent"
android:layout_height="500dp"
android:gravity="center_vertical|center_horizontal"
android:text="FragmentOne" />
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_marginBottom="16dp"
android:layout_marginEnd="16dp"
app:backgroundTint="@color/colorAccent"
app:fabSize="mini"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:srcCompat="@android:drawable/ic_input_add" />
解决方案
您需要FloatingActionButton
在 xml 中添加一个带有 id 的 id fab
,这导致它为空。
此外,当将可能为空的内容转换为非空类型(此处为 FloatingActionButton)时,您需要使用?
尝试
val fab = findViewById<View>(R.id.fab) as? FloatingActionButton
有关更多信息,请阅读https://kotlinlang.org/docs/reference/typecasts.html#safe-nullable-cast-operator
编辑
@Pawel 的评论真的很有帮助。阅读https://kotlinlang.org/docs/tutorials/android-plugin.html以摆脱findViewById
调用,这是 NPE 的主要原因。
推荐阅读
- python - 如何更改多个特定列的 dtype
- r - 用 R 中的日期(格式 dd-mm-yyyy)替换数值
- python - 为什么我不能将我的图像放在眼睛检测上?
- coinbase-api - CoinBase SDK在android中的实现
- python - Gitlhub 访问令牌不起作用'$GITLAB_AUTH_TOKEN
- ansible - 如何使用 ansible 修改 SPARK_SUBMIT_OPTIONS
- r - 根据数字的长度和数字的部分将数据分类
- javascript - JavaScript:刷新页面后如何保存分数和首字母并向现有分数和首字母添加更多分数和首字母。?
- javascript - 如何在 React 的聊天应用中更新新消息?
- pixi.js - 无法在 pixi.js 中使用 svg.js 添加矩形