【发布时间】:2021-03-31 19:54:33
【问题描述】:
刚接触编码约 1 个月。抱歉,如果在其他地方回答了这个问题,但花了几个小时查看其他类似的问题,但无法完全正确。 什么:试图将位置点击数据从片段1(MainFragment)传递给片段2(MapsFragment)以加载对应的地图。通过适配器 onclick 方法,因为我想在 MainFragment 上使用 RecyclerView。项目是可构建的,但是当我单击 recyclerview 上的项目时崩溃(无法打开地图)。怎么了???
提前谢谢!!
编辑:已回答 谢谢大家的cmets。能够通过以下方式解决此问题:1)将 mapsfragment 上的 lateinit var 更改为常规 var + nullable,以及 2)将主片段中的 bundle 行更改为
val bundle = bundleOf(EXTRA_USER_MAP to sports[position])
view.findNavController(.navigate(R.id.action_mainFragment_to_mapsFragment, bundle)
哇哦 Kotlin!
主要片段:
const val EXTRA_USER_MAP = "EXTRA_USER_MAP"
private const val TAG = "MainFragment"
class MainFragment : Fragment() {
override fun onCreateView ... // code to inflate my fragment view
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val sports = generateData()
myMaps.layoutManager = LinearLayoutManager(activity)
myMaps.adapter = this.context?.let {
MapsAdapter(it, sports, object: MapsAdapter.OnClickListener {
override fun onItemClick(position: Int) {
Log.i(TAG, "onItemClick $position")
// When user taps on view in recyclerview, navigate to new fragment and opens corresponding map
val bundle = Bundle()
bundle.putSerializable(EXTRA_USER_MAP, sports[position])
view.findNavController().navigate(R.id.action_mainFragment_to_mapsFragment)
}
})
}
}
private fun generateData(): List<Sport> { ... // code for my data set
地图片段
private const val TAG = "MapsFragment"
class MapsFragment : Fragment(), OnMapReadyCallback {
private lateinit var map: GoogleMap
private lateinit var sport: Sport
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_maps, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val bundle = arguments
if (bundle !=null) {
sport = bundle.getSerializable(EXTRA_USER_MAP) as Sport
}
val mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
mapFragment?.getMapAsync(this)
}
// Actions for map
override fun onMapReady(googleMap: GoogleMap) {
map = googleMap
Log.i(TAG, "Map rendered: ${sport.title}") // Logcat check once working
...
相关适配器代码
class MapsAdapter(
val context: Context,
val sports: List<Sport>,
val onClickListener: OnClickListener)
: RecyclerView.Adapter<MapsAdapter.ViewHolder>() {
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
interface OnClickListener {
fun onItemClick(position: Int)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val sport = sports[position]
holder.itemView.setOnClickListener {
Log.i(TAG, "Tapped on position $position")
onClickListener.onItemClick(position)
}
...
【问题讨论】:
-
您不会将您的
Bundle传递给您对navigate的调用。你是故意的吗? -
抱歉,这会是什么样子?这可能是它
-
您已经进行了 1 个月的编码,并且已经到了这一步。哇
-
@kaustubhpatange 我按照捆绑说明进行操作,终于搞定了!!谢谢
标签: android kotlin android-fragments bundle serializable