当应用程序在肖像上时,一切都很好,但当我使用风景时(我创建了应用程序的2个视觉,但只有肖像工作),应用程序突然关闭并显示java.lang.NullPointerException: findViewById(R.id.roll_button) must not be null
或Unable to start activity ComponentInfo{MainActivity}: java.lang.NullPointerException
。
我从互联网上添加了一些解决方案,包括添加android:configchanges
或android:scrrenOrientation="portrait"
,它没有帮助。
代码如下所示:
主要活动:
class MainActivity : AppCompatActivity() {
lateinit var diceImage: ImageView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val rollButton: Button = findViewById(R.id.roll_button)!!
rollButton.setOnClickListener {
rollDice()
}
diceImage = findViewById(R.id.dice_image)
}
private fun rollDice() {
val randomInt = Random().nextInt(6) + 1
val drawableResource = when (randomInt) {
1 -> R.drawable.dice_1
2 -> R.drawable.dice_2
3 -> R.drawable.dice_3
4 -> R.drawable.dice_4
5 -> R.drawable.dice_5
else -> R.drawable.dice_6
}
diceImage.setImageResource(drawableResource)
}
}
下面的代码是activity_main.xml:(以下大多数都可以)
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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:configChanges="orientation|screenSize"
tools:context=".MainActivity"
>
<ImageView
android:id="@+id/dice_image"
android:layout_width="123dp"
android:layout_height="96dp"
android:layout_marginStart="144dp"
android:layout_marginTop="112dp"
android:configChanges="orientation|screenSize"
android:src="@drawable/empty_dice"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:contentDescription="TODO" />
<Button
android:id="@+id/roll_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="6dp"
android:text="@string/roll"
android:configChanges="orientation|screenSize"
app:layout_constraintBottom_toTopOf="@+id/textView2"
app:layout_constraintStart_toEndOf="@+id/textView2"/>
</android.support.constraint.ConstraintLayout>
3条答案
按热度按时间q8l4jmvw1#
请添加LogCat错误和LandscapeMode布局详细信息。
我建议你使用下面的解决方案。
使用视图绑定或数据绑定避免**findViewById()**在开发中更易于使用。
只需遵循一些步骤
1.在build.gradle应用程序中添加以下行
2.在父布局中使用此关键字tools:viewBindingIgnore=“true”。
1.你的活动的onCreate()是这样的.
1.现在您可以轻松访问所有ID。
有关详细信息,请访问https://developer.android.com/topic/libraries/view-binding
对于数据绑定,请访问https://developer.android.com/topic/libraries/data-binding
ygya80vv2#
永远不要用!!(非空Assert操作符)..没有良好的生产应用程序使用它..问题是,该ID是在文件activity_main中找不到.您是否使用2个不同的XML文件,一个用于横向和一个用于纵向.如果是,只需检查配置中,你得到崩溃有该ID,否则,没有理由崩溃。数据绑定和视图绑定是避免null pouiter异常的好方法
0ejtzxu13#
这个问题的标签之一是Kotlin,这里有一个简单的例子来演示savedInstanceState(),它是一个***非常***简单的老虎机 'game',保存水果图像的状态和分数。
主要活动.kt
这是Constants.kt文件,其中包含saveInstanceState的键和一些伪值(“Int Array”和“Score”)。
我犯的一个错误是轻率地接受Android Studios代码完成并使用:
覆盖fun onSaveInstanceState(输出状态:束,输出持久状态:持久性捆绑包)
而不仅仅是:
打开保存示例状态(输出状态:捆绑)
This is also an answer to this question会陷入一些潜在的陷阱也是Joed Goh, this answer is based on this work的***巨大优势***