首页 > 解决方案 > 片段中的 Kotlin RecyclerView - 导航架构组件 - 空错误

问题描述

我正在尝试在片段中创建 RecyclerView,但在 RecyclerView 上出现空错误。我能够使用带有底部导航栏的新导航架构组件成功创建片段。我正在运行 Android Studio canary 3.2 Beta 1。

请注意我哪里出错了,因为我在 Android Studio 中没有看到任何红线。

调试错误

E/AndroidRuntime:致命异常:主进程:com.projects.arise.mytestapp,PID:28285 java.lang.RuntimeException:无法启动活动 ComponentInfo{com.projects.arise.mytestapp/com.projects.arise.mytestapp.MainActivity }: java.lang.IllegalStateException: rview_keys 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) 在 android.app.ActivityThread 不能为空。 -wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper .java:164) 在 android.app.ActivityThread.main(ActivityThread.java:6541) 在 java.lang.reflect.Method。在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 的 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 调用(Native Method) 原因:java。 lang.IllegalStateException:rview_keys 在 com.projects.arise.mytestapp.MainActivity.onCreate(MainActivity.kt:55) 在 android.app.Activity.performCreate(Activity.java:6975) 在 android.app.Instrumentation 不能为空。 callActivityOnCreate(Instrumentation.java:1213) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) 在 android.app.ActivityThread.-wrap11(未知来源:0) 在 android.os.Handler 的 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)。dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6541) at java.lang.reflect.Method.invoke(Native方法)在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

MainActivity.kt

class MainActivity : AppCompatActivity() {

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

        val host: NavHostFragment = supportFragmentManager
                .findFragmentById(R.id.nav_host_fragment) as NavHostFragment? ?: return

        val navController = host.navController
        setupBottomNavMenu(navController)
    }

    override fun onSupportNavigateUp(): Boolean {
        return Navigation.findNavController(this, R.id.nav_host_fragment).navigateUp()
    }

    private fun setupBottomNavMenu(navController: NavController) {
        findViewById<BottomNavigationView>(R.id.navigation)?.let { bottomNavView ->
            NavigationUI.setupWithNavController(bottomNavView, navController)
        }
    }
}

片段密钥.kt

class FragmentKeys : Fragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        setHasOptionsMenu(true)
        return inflater.inflate(R.layout.fragment_keys_layout, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        //val rview_keys: RecyclerView = findViewById(R.id.rview_keys)
        rview_keys.layoutManager = LinearLayoutManager(context)
        rview_keys.adapter = AdapterKeys(KeysListObjects.keys)
    }
}

我注释掉了上面的一行,因为我在“findViewById”上收到“未解决的参考”错误。这行似乎没有必要,因为它不在其他人的代码中。例如:Kotlin Android Fragment recyclerView and context issue

AdapterKeys.kt

class AdapterKeys(val keys: List<KeysList>) : RecyclerView.Adapter<AdapterKeys.KeysViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): KeysViewHolder {
        val view = LayoutInflater.from(parent?.context).inflate(R.layout.list_item_keys, parent, false)
        return KeysViewHolder(view)
    }

    override fun getItemCount() : Int {
        return keys.size
    } //override fun getItemCount() = keys.size

    override fun onBindViewHolder(holder: KeysViewHolder, position: Int) {
        val keysList = keys[position]
        holder.setData(keysList, position)
    }

    inner class KeysViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        fun setData(keysList: KeysList?, position: Int) {
            itemView.tview_Keys.text = keysList!!.keysText
        }
    }
}

模型键.kt

object KeysListObjects {
    val keys = listOf<KeysList>(
            KeysList("Testing1"),
            KeysList("Testing2"),
            KeysList("Testing3")
    )
}

标签: android-fragmentsandroid-recyclerviewkotlinnavigationandroid-architecture-components

解决方案


您收到错误是因为您对此发表了评论

//val rview_keys: RecyclerView = findViewById(R.id.rview_keys)

没有将rview_keys声明为变量。所以它正在考虑 rview_keys 作为一个视图,因为在你的活动中你有一个 id为 rview_keys的视图。

以下错误行只是确认它。

java.lang.IllegalStateException:rview_keys 在 com.projects.arise.mytestapp.MainActivity.onCreate(MainActivity.kt:55) 处不得为空

检查 MainActivity 第 55 行的代码。

这些人没有这条线的原因是他们将其用作视图。而且你不能将它用作onActivityCreated() 中的视图。


推荐阅读