片段中的 Kotlin RecyclerView - 导航架构组件 - 空错误
Kotlin RecyclerView in Fragment - Navigation architecture component - null error
我正在尝试在片段中创建 RecyclerView,但在 RecyclerView 上出现空错误。我能够使用带有底部导航栏的新导航架构组件成功创建片段。我是 运行 Android Studio canary 3.2 Beta 1.
请注意我哪里出错了,因为我在 Android Studio 中没有看到任何红线。
调试错误
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.projects.arise.mytestapp, PID: 28285
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.projects.arise.mytestapp/com.projects.arise.mytestapp.MainActivity}:
java.lang.IllegalStateException: rview_keys must not be null
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at 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)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.IllegalStateException: rview_keys must not be null
at com.projects.arise.mytestapp.MainActivity.onCreate(MainActivity.kt:55)
at android.app.Activity.performCreate(Activity.java:6975)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at 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)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at 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)
}
}
}
FragmentKeys.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" 上收到 "unresolved reference" 错误。这一行似乎没有必要,因为它不在其他人的代码中。例如:
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
}
}
}
ModelKeys.kt
object KeysListObjects {
val keys = listOf<KeysList>(
KeysList("Testing1"),
KeysList("Testing2"),
KeysList("Testing3")
)
}
你收到错误是因为你评论了这个
//val rview_keys: RecyclerView = findViewById(R.id.rview_keys)
没有将 rview_keys 声明为变量。所以它正在考虑 rview_keys 作为一个视图,因为在你的 activity 中你有一个 ID 为 rview_keys.
的视图
以下错误行只需确认即可。
java.lang.IllegalStateException: rview_keys must not be null at com.projects.arise.mytestapp.MainActivity.onCreate(MainActivity.kt:55) at
检查 MainActivity 第 55 行的代码。
这些人没有那条线的原因是他们将它用作视图。
而且您不能将其用作 onActivityCreated() 中的视图。
我必须做两件事才能让它工作:
- 将两行 rview_keys 代码从 onActivityCreated 移到 onViewCreated(我相信它在片段生命周期的早期)。感谢以上海报的反馈!所以现在我的片段 class 看起来像这样:
FragmentKeys.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)
rview_keys.layoutManager = LinearLayoutManager(context)
rview_keys.adapter = AdapterKeys(KeysListObjects.keys)
}
}
- 我仍然遇到构建错误,所以我尝试将 build.gradle 文件 (jdk7) 中的一个 Kotlin 依赖项更改回之前的状态 (jre7),尽管我收到了弃用警告。
我被要求使用的新依赖项 - 它不起作用:
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
我切换回的旧依赖项 - 正在工作(目前):
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
我正在尝试在片段中创建 RecyclerView,但在 RecyclerView 上出现空错误。我能够使用带有底部导航栏的新导航架构组件成功创建片段。我是 运行 Android Studio canary 3.2 Beta 1.
请注意我哪里出错了,因为我在 Android Studio 中没有看到任何红线。
调试错误
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.projects.arise.mytestapp, PID: 28285 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.projects.arise.mytestapp/com.projects.arise.mytestapp.MainActivity}: java.lang.IllegalStateException: rview_keys must not be null at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) at 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) at android.app.ActivityThread.main(ActivityThread.java:6541) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) Caused by: java.lang.IllegalStateException: rview_keys must not be null at com.projects.arise.mytestapp.MainActivity.onCreate(MainActivity.kt:55) at android.app.Activity.performCreate(Activity.java:6975) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) at 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) at android.app.ActivityThread.main(ActivityThread.java:6541) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at 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)
}
}
}
FragmentKeys.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" 上收到 "unresolved reference" 错误。这一行似乎没有必要,因为它不在其他人的代码中。例如:
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
}
}
}
ModelKeys.kt
object KeysListObjects {
val keys = listOf<KeysList>(
KeysList("Testing1"),
KeysList("Testing2"),
KeysList("Testing3")
)
}
你收到错误是因为你评论了这个
//val rview_keys: RecyclerView = findViewById(R.id.rview_keys)
没有将 rview_keys 声明为变量。所以它正在考虑 rview_keys 作为一个视图,因为在你的 activity 中你有一个 ID 为 rview_keys.
的视图以下错误行只需确认即可。
java.lang.IllegalStateException: rview_keys must not be null at com.projects.arise.mytestapp.MainActivity.onCreate(MainActivity.kt:55) at
检查 MainActivity 第 55 行的代码。
这些人没有那条线的原因是他们将它用作视图。 而且您不能将其用作 onActivityCreated() 中的视图。
我必须做两件事才能让它工作:
- 将两行 rview_keys 代码从 onActivityCreated 移到 onViewCreated(我相信它在片段生命周期的早期)。感谢以上海报的反馈!所以现在我的片段 class 看起来像这样:
FragmentKeys.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)
rview_keys.layoutManager = LinearLayoutManager(context)
rview_keys.adapter = AdapterKeys(KeysListObjects.keys)
}
}
- 我仍然遇到构建错误,所以我尝试将 build.gradle 文件 (jdk7) 中的一个 Kotlin 依赖项更改回之前的状态 (jre7),尽管我收到了弃用警告。
我被要求使用的新依赖项 - 它不起作用:
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
我切换回的旧依赖项 - 正在工作(目前):
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"