首页 > 解决方案 > 如何以正确的方式将上下文传递给与 Kotlin 的对话?

问题描述

很抱歉提出了一个愚蠢的问题,但只是在尝试 Kotlin 时有点困惑。从 MainActivity 我试图用回收器调用对话框。部分回收器工作正常,因为我在没有单独对话框的情况下尝试它。但是当我试图在对话框中调用它时,它会因空指针而崩溃。我想它无法识别视图,但我将上下文作为堆栈中的示例传递,但它不起作用

对话类

class LanguageDialog(context: Context) : Dialog(context), LanguageAdapter.ItemClickListener{
    private var mRussianFlagLink = "https://cdn3.iconfinder.com/data/icons/142-mini-country-flags-16x16px/32/flag-russia2x.png"
    private var mEnglishFlagLink = "https://cdn3.iconfinder.com/data/icons/142-mini-country-flags-16x16px/32/flag-united-kingdom2x.png"

    private lateinit var mLanguageAdapter : LanguageAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.dialog_languages)

        val mLanguageList : MutableList<Language> = mutableListOf(Language("Russian", mRussianFlagLink), Language("English", mEnglishFlagLink))

        val mRecyclerView = findViewById<RecyclerView>(R.id.recycle_languages)
        mRecyclerView.layoutManager = LinearLayoutManager(context)
        mLanguageAdapter = LanguageAdapter(mLanguageList, context)
        mLanguageAdapter.setClickListener(this)
        mRecyclerView.adapter = mLanguageAdapter
    }

    override fun onItemClick(view: View, position: Int) {
        Log.d("Test", "CLICK")
    }
}

在这里崩溃

            mRecyclerView.layoutManager = LinearLayoutManager(context)

从 MainActivity 调用

private fun callLanguageDialog() {
    val mDialog = LanguageDialog(this)
    mDialog.show()

错误日志

FATAL EXCEPTION: main
                                                                     Process: com.example.a3802256.zzzz, PID: 9833
                                                                     java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.a3802256.zzzz/com.example.a3802256.zzzz.main.MainActivity}: java.lang.IllegalStateException: mRecyclerView must not be null
                                                                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)
                                                                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
                                                                         at android.app.ActivityThread.-wrap12(ActivityThread.java)
                                                                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
                                                                         at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                         at android.os.Looper.loop(Looper.java:154)
                                                                         at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                                         at java.lang.reflect.Method.invoke(Native Method)
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
                                                                      Caused by: java.lang.IllegalStateException: mRecyclerView must not be null
                                                                         at com.example.a3802256.zzzz.LanguageDialog.onCreate(LanguageDialog.kt:26)
                                                                         at android.app.Dialog.dispatchOnCreate(Dialog.java:395)
                                                                         at android.app.Dialog.show(Dialog.java:294)
                                                                         at com.example.a3802256.zzzz.main.MainActivity.callLanguageDialog(MainActivity.kt:20)
                                                                         at com.example.a3802256.zzzz.main.MainActivity.onCreate(MainActivity.kt:15)
                                                                         at android.app.Activity.performCreate(Activity.java:6679)
                                                                         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
                                                                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
                                                                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
                                                                         at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                                                                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
                                                                         at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                         at android.os.Looper.loop(Looper.java:154) 
                                                                         at android.app.ActivityThread.main(ActivityThread.java:6119) 
                                                                         at java.lang.reflect.Method.invoke(Native Method) 
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

标签: androidkotlin

解决方案


尝试在 init 中使用初始化上下文并从 Dialog(context)in 中删除上下文LanguageDialog

class LanguageDialog(context: Context) : Dialog, LanguageAdapter.ItemClickListener {
    private var context: Context? = null
    init
     {
       this.context = context
     }
    private var mRussianFlagLink = "https://cdn3.iconfinder.com/data/icons/142-mini-country-flags-16x16px/32/flag-russia2x.png"
    private var mEnglishFlagLink = "https://cdn3.iconfinder.com/data/icons/142-mini-country-flags-16x16px/32/flag-united-kingdom2x.png"

    private lateinit var mLanguageAdapter : LanguageAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.dialog_languages)

        val mLanguageList : MutableList<Language> = mutableListOf(Language("Russian", mRussianFlagLink), Language("English", mEnglishFlagLink))

        val mRecyclerView = findViewById<RecyclerView>(R.id.recycle_languages)
        mRecyclerView.layoutManager = LinearLayoutManager(context)
        mLanguageAdapter = LanguageAdapter(mLanguageList, context)
        mLanguageAdapter.setClickListener(this)
        mRecyclerView.adapter = mLanguageAdapter
    }

    override fun onItemClick(view: View, position: Int) {
        Log.d("Test", "CLICK")
    }
}

推荐阅读