findViewById 在警报对话框小部件上使用时抛出空异常
findViewById throws null exception when it is used on Alert Dialog widgets
我有一个自定义的警报对话框 layout_dialog.xml
、activity_main.xml
和 MainActivivty.kt
我正在尝试使用 MainActivity.kt
中的 findViewById()
来获取按钮和 textView从这里的警报对话框是我的代码的一部分:
tv7 = findViewById(R.id.tv7)
bt4 = findViewById(R.id.bt4)
但我收到以下异常:
java.lang.NullPointerException: findViewById(R.id.tv7) must not be null
这里是完整的错误信息:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.wordschain, PID: 8398
java.lang.NullPointerException: findViewById(R.id.tv7) must not be null
at com.example.wordschain.MainActivity.create_Alert_Dialog(MainActivity.kt:83)
at com.example.wordschain.MainActivity.do1(MainActivity.kt:318)
at com.example.wordschain.MainActivity$onCreate.onClick(MainActivity.kt:48)
at android.view.View.performClick(View.java:6329)
at android.view.View$PerformClick.run(View.java:25002)
at android.os.Handler.handleCallback(Handler.java:809)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:166)
at android.app.ActivityThread.main(ActivityThread.java:7555)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:469)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:963)
注意:我在调试模式下收到此消息。
编辑:我在这里分享 layout_dialog.xml
片段:
<?xml version="1.0" encoding="utf-8"?>
<data />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
android:background="@color/white">
<TextView
android:id="@+id/tv7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="You lost with score"
android:background="@color/Red2"
android:textSize="40sp"
android:layout_centerHorizontal="true" />
<Button
android:id="@+id/bt4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/tv7"
android:layout_centerHorizontal="true"
android:text="Restart"
android:textSize="20sp"
android:layout_marginTop="15dp" />
<TextView
android:id="@+id/tv8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/bt4"
android:layout_centerHorizontal="true"
android:text="Or watch an Ad and continue with 2 chances"
android:textSize="18sp"
android:textColor="@color/Black"
android:layout_marginTop="15dp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/tv8"
android:layout_centerHorizontal="true"
android:text="Watch Ad"
android:textSize="20sp"
android:layout_marginTop="15dp" />
</RelativeLayout>
这里是我在主要 activity 中使用 findViewById()
的地方:
class MainActivity : AppCompatActivity() {
//Some code ....
override fun onCreate(savedInstanceState: Bundle?) {
//Some code ...
}
fun create_Alert_Dialog(How: Int){
//Alert dialog builder
val messageBoxView = LayoutInflater.from(this).inflate(R.layout.layout_dialog,null)
//Alert dialog builder
val messageBoxBuilder = AlertDialog.Builder(this).setView(messageBoxView)
//Setting undissmissable
messageBoxBuilder.setCancelable(false)
//Show
messageBoxBuilder.show()
tv7 = findViewById(R.id.tv7)
bt4 = findViewById(R.id.bt4)
bt4.setOnClickListener { Lose() }
}
替换为:
tv7 = findViewById(R.id.tv7)
bt4 = findViewById(R.id.bt4)
有了这个:
tv7 = messageBoxView.findViewById(R.id.tv7)
bt4 = messageBoxView.findViewById(R.id.bt4)
您正在将视图(对话框)膨胀到您的 activity 中:
val messageBoxView = LayoutInflater.from(this).inflate(R.layout.layout_dialog, null)
然后您需要定义 tv7 和 bt4 视图,但它们位于您之前扩充的视图中。所以你需要根据膨胀视图来定义它们。
id 为 tv7 的元素不在 activity 中,它存在于对话框视图中。 messageBoxView 是您的对话框放大视图。因此,您要在该布局内访问的任何视图都必须在其引用下。
tv7 = messageBoxView.findViewById(R.id.tv7)
bt4 = messageBoxView.findViewById(R.id.bt4)
我有一个自定义的警报对话框 layout_dialog.xml
、activity_main.xml
和 MainActivivty.kt
我正在尝试使用 MainActivity.kt
中的 findViewById()
来获取按钮和 textView从这里的警报对话框是我的代码的一部分:
tv7 = findViewById(R.id.tv7)
bt4 = findViewById(R.id.bt4)
但我收到以下异常:
java.lang.NullPointerException: findViewById(R.id.tv7) must not be null
这里是完整的错误信息:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.wordschain, PID: 8398
java.lang.NullPointerException: findViewById(R.id.tv7) must not be null
at com.example.wordschain.MainActivity.create_Alert_Dialog(MainActivity.kt:83)
at com.example.wordschain.MainActivity.do1(MainActivity.kt:318)
at com.example.wordschain.MainActivity$onCreate.onClick(MainActivity.kt:48)
at android.view.View.performClick(View.java:6329)
at android.view.View$PerformClick.run(View.java:25002)
at android.os.Handler.handleCallback(Handler.java:809)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:166)
at android.app.ActivityThread.main(ActivityThread.java:7555)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:469)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:963)
注意:我在调试模式下收到此消息。
编辑:我在这里分享 layout_dialog.xml
片段:
<?xml version="1.0" encoding="utf-8"?>
<data />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
android:background="@color/white">
<TextView
android:id="@+id/tv7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="You lost with score"
android:background="@color/Red2"
android:textSize="40sp"
android:layout_centerHorizontal="true" />
<Button
android:id="@+id/bt4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/tv7"
android:layout_centerHorizontal="true"
android:text="Restart"
android:textSize="20sp"
android:layout_marginTop="15dp" />
<TextView
android:id="@+id/tv8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/bt4"
android:layout_centerHorizontal="true"
android:text="Or watch an Ad and continue with 2 chances"
android:textSize="18sp"
android:textColor="@color/Black"
android:layout_marginTop="15dp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/tv8"
android:layout_centerHorizontal="true"
android:text="Watch Ad"
android:textSize="20sp"
android:layout_marginTop="15dp" />
</RelativeLayout>
这里是我在主要 activity 中使用 findViewById()
的地方:
class MainActivity : AppCompatActivity() {
//Some code ....
override fun onCreate(savedInstanceState: Bundle?) {
//Some code ...
}
fun create_Alert_Dialog(How: Int){
//Alert dialog builder
val messageBoxView = LayoutInflater.from(this).inflate(R.layout.layout_dialog,null)
//Alert dialog builder
val messageBoxBuilder = AlertDialog.Builder(this).setView(messageBoxView)
//Setting undissmissable
messageBoxBuilder.setCancelable(false)
//Show
messageBoxBuilder.show()
tv7 = findViewById(R.id.tv7)
bt4 = findViewById(R.id.bt4)
bt4.setOnClickListener { Lose() }
}
替换为:
tv7 = findViewById(R.id.tv7)
bt4 = findViewById(R.id.bt4)
有了这个:
tv7 = messageBoxView.findViewById(R.id.tv7)
bt4 = messageBoxView.findViewById(R.id.bt4)
您正在将视图(对话框)膨胀到您的 activity 中:
val messageBoxView = LayoutInflater.from(this).inflate(R.layout.layout_dialog, null)
然后您需要定义 tv7 和 bt4 视图,但它们位于您之前扩充的视图中。所以你需要根据膨胀视图来定义它们。
id 为 tv7 的元素不在 activity 中,它存在于对话框视图中。 messageBoxView 是您的对话框放大视图。因此,您要在该布局内访问的任何视图都必须在其引用下。
tv7 = messageBoxView.findViewById(R.id.tv7)
bt4 = messageBoxView.findViewById(R.id.bt4)