Android Studio/Kotlin - findViewById 使我的应用程序崩溃
Android Studio/Kotlin - findViewById crash my app
程序在到达 findViewById 时停止,我不明白为什么:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.splash_screen)
handler.postDelayed({ setContentView(R.layout.activity_main) }, 500) // 5 seconds
val imageView: ImageView = findViewById(R.id.splashScreenIMG)
Glide.with(this).load(R.drawable.sligames_waiting).into(imageView)
}
fun showButtons()
{
val view: View = findViewById(R.id.boutonOui)
val cx = view.width / 2
val cy = view.height / 2
val finalRadius = hypot(cx.toDouble(), cy.toDouble()).toFloat()
val anim = ViewAnimationUtils.createCircularReveal(view, cx, cy, 0f, finalRadius)
// make the view visible and start the animation
view.visibility = View.VISIBLE
anim.duration = 1500
anim.start()
}
我使用此行从另一个文件执行此函数:
MainActivity().showButtons()
这是堆栈跟踪:
2020-06-01 12:55:02.783 22557-22557/com.example.yourmajesty E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.yourmajesty, PID: 22557
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
at android.content.ContextWrapper.getApplicationInfo(ContextWrapper.java:163)
at android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:174)
at android.content.Context.obtainStyledAttributes(Context.java:738)
at androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor(AppCompatDelegateImpl.java:692)
at androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor(AppCompatDelegateImpl.java:659)
at androidx.appcompat.app.AppCompatDelegateImpl.findViewById(AppCompatDelegateImpl.java:479)
at androidx.appcompat.app.AppCompatActivity.findViewById(AppCompatActivity.java:214)
at com.example.yourmajesty.MainActivity.showButtons(MainActivity.kt:122)
at com.example.yourmajesty.Dialog.dialogChanger(Dialog.kt:26)
at com.example.yourmajesty.MainActivity$dialogBoxDiseappear.run(MainActivity.kt:190)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7695)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
提前致谢
MainActivity().showButtons()
您无法从 activity
启动对象。您只能启动它并将数据与其 Intent
捆绑在一起
如果您尝试从 fragment
与 MainActvitiy
通信,请参阅 this thread
要在 Kotlin 中创建对 class 对象的引用,您可以使用
(activity as MainActivity!!)?.showButtons()
这样做的目的是创建一个已经 运行 class 的引用,而不是再创建一个实例,因为它没有被实例化,所以总是会为视图提供 NPE。
此外,请记住引用其他 Class
或 Fragment
的视图仅在 class 具有 运行 实例时有效,您可以引用实际上不存在的函数需要创建视图只需要Context
,但是引用Views或者任何需要先初始化的对象都会给NPE。
程序在到达 findViewById 时停止,我不明白为什么:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.splash_screen)
handler.postDelayed({ setContentView(R.layout.activity_main) }, 500) // 5 seconds
val imageView: ImageView = findViewById(R.id.splashScreenIMG)
Glide.with(this).load(R.drawable.sligames_waiting).into(imageView)
}
fun showButtons()
{
val view: View = findViewById(R.id.boutonOui)
val cx = view.width / 2
val cy = view.height / 2
val finalRadius = hypot(cx.toDouble(), cy.toDouble()).toFloat()
val anim = ViewAnimationUtils.createCircularReveal(view, cx, cy, 0f, finalRadius)
// make the view visible and start the animation
view.visibility = View.VISIBLE
anim.duration = 1500
anim.start()
}
我使用此行从另一个文件执行此函数:
MainActivity().showButtons()
这是堆栈跟踪:
2020-06-01 12:55:02.783 22557-22557/com.example.yourmajesty E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.yourmajesty, PID: 22557
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
at android.content.ContextWrapper.getApplicationInfo(ContextWrapper.java:163)
at android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:174)
at android.content.Context.obtainStyledAttributes(Context.java:738)
at androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor(AppCompatDelegateImpl.java:692)
at androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor(AppCompatDelegateImpl.java:659)
at androidx.appcompat.app.AppCompatDelegateImpl.findViewById(AppCompatDelegateImpl.java:479)
at androidx.appcompat.app.AppCompatActivity.findViewById(AppCompatActivity.java:214)
at com.example.yourmajesty.MainActivity.showButtons(MainActivity.kt:122)
at com.example.yourmajesty.Dialog.dialogChanger(Dialog.kt:26)
at com.example.yourmajesty.MainActivity$dialogBoxDiseappear.run(MainActivity.kt:190)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7695)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
提前致谢
MainActivity().showButtons()
您无法从 activity
启动对象。您只能启动它并将数据与其 Intent
如果您尝试从 fragment
MainActvitiy
通信,请参阅 this thread
要在 Kotlin 中创建对 class 对象的引用,您可以使用
(activity as MainActivity!!)?.showButtons()
这样做的目的是创建一个已经 运行 class 的引用,而不是再创建一个实例,因为它没有被实例化,所以总是会为视图提供 NPE。
此外,请记住引用其他 Class
或 Fragment
的视图仅在 class 具有 运行 实例时有效,您可以引用实际上不存在的函数需要创建视图只需要Context
,但是引用Views或者任何需要先初始化的对象都会给NPE。