Kotlin Android Fragment recyclerView 和上下文问题
Posted
技术标签:
【中文标题】Kotlin Android Fragment recyclerView 和上下文问题【英文标题】:Kotlin Android Fragment recyclerView and context issue 【发布时间】:2018-10-29 19:59:34 【问题描述】:我想在片段中创建一个recyclerView,但它显示错误“ java.lang.IllegalStateException: recyclerView_Main must not be null 在 com.gph.bottomnavigation.FragmentMe.onCreateView(FragmentMe.kt:28)"
问题 1) 请帮助解决此问题。 问题2)我只在一个没有任何片段的空项目中创建了一个recyclerView,它工作正常。但是相同的代码在 Fragment 中不起作用,它显示错误,所以我将“recylerView_Main.layoutManager = LinearLayoutManager(this)”更改为“recylerView_Main.layoutManager = LinearLayoutManager(context)” 它没有显示错误,我可以在模拟器中运行,但是当我单击片段的导航按钮时,应用程序停止并显示此错误。请帮助解决它。
这里是 FragmentMe.kt 的代码:
class FragmentMe : Fragment()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View?
recylerView_Main.layoutManager = LinearLayoutManager(context)
recylerView_Main.adapter = Mainadapter()
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_me, container, false)
这里是MainActivity.kt的代码:
class MainActivity : AppCompatActivity()
val manager = supportFragmentManager
private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener item ->
when (item.itemId)
R.id.navigation_home ->
//message.setText(R.string.title_home)
createFragmentQpon()
return@OnNavigationItemSelectedListener true
R.id.navigation_dashboard ->
//message.setText(R.string.title_dashboard)
createFragmentMe()
return@OnNavigationItemSelectedListener true
R.id.navigation_notifications ->
//message.setText(R.string.title_notifications)
createFragmentTools()
return@OnNavigationItemSelectedListener true
false
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//Action Bar
val actionBar = supportActionBar
actionBar!!.setDisplayShowHomeEnabled(true)
actionBar.setBackgroundDrawable(ColorDrawable(Color.parseColor("#00FFFFFF")))
actionBar.setIcon(R.drawable.ic_home_black_24dp)
actionBar.setDisplayShowTitleEnabled(false)
createFragmentQpon()
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
fun createFragmentQpon()
val transaction = manager.beginTransaction()
val fragment = FragmentQpon()
transaction.replace(R.id.fragmentholder,fragment)
transaction.addToBackStack(null)
transaction.commit()
fun createFragmentMe()
val transaction = manager.beginTransaction()
val fragment = FragmentMe()
transaction.replace(R.id.fragmentholder,fragment)
transaction.addToBackStack(null)
transaction.commit()
fun createFragmentTools()
val transaction = manager.beginTransaction()
val fragment = FragmentTools()
transaction.replace(R.id.fragmentholder,fragment)
transaction.addToBackStack(null)
transaction.commit()
这里是 Mainadapter.kt 的代码:
class Mainadapter: RecyclerView.Adapter<CustomViewHolder>()
val videolist = listOf("aaa","bbbb","cccc")
override fun getItemCount(): Int
return 3
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomViewHolder
val layoutInflater = LayoutInflater.from(parent?.context)
val cellForRow = layoutInflater.inflate(R.layout.tutorial_layout, parent, false)
return CustomViewHolder(cellForRow)
override fun onBindViewHolder(holder: CustomViewHolder, position: Int)
var videoName = videolist.get(position)
holder.itemView.title.text = videoName
class CustomViewHolder(v: View): RecyclerView.ViewHolder(v)
【问题讨论】:
【参考方案1】:移动此代码
recylerView_Main.layoutManager = LinearLayoutManager(context)
recylerView_Main.adapter = Mainadapter()
从onCreateView
到onActivityCreated
覆盖onActivityCreated
并放置上面的代码。
您的代码中有两处不正确:
您正在尝试访问recyclerView
,甚至在为视图膨胀之前。
Fragment 的上下文在 onCreateView 中为 null,可在 onAttach
和 onDetach
之间使用
【讨论】:
非常感谢!你能解释一下为什么我在 Fragment 而不是 MainActivity 中运行时必须将“recylerView_Main.layoutManager = LinearLayoutManager(this)”更改为“recylerView_Main.layoutManager = LinearLayoutManager(context)”吗? Fargments 没有上下文,而 Activity 有上下文,所以你不能将它用于 Fragment。【参考方案2】:recylerView_Main.layoutManager = LinearLayoutManager(this.context)
试试这个,对我来说效果很好。
【讨论】:
以上是关于Kotlin Android Fragment recyclerView 和上下文问题的主要内容,如果未能解决你的问题,请参考以下文章
Android Kotlin:在 Fragment 下带有 Intent 的 setOnClickListener
在 Fragment 中使用 RecyclerView 时出现 Kotlin 错误的 Android
在 Fragment 当中使用 Kotlin-Android-Extensions 需要注意的
Kotlin Android Fragment recyclerView 和上下文问题