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。

此外,请记住引用其他 ClassFragment 的视图仅在 class 具有 运行 实例时有效,您可以引用实际上不存在的函数需要创建视图只需要Context,但是引用Views或者任何需要先初始化的对象都会给NPE。