android - Kotlin 片段:活动在 onActivityCreated 之外返回 null
问题描述
我正在尝试startActionMode
在片段中使用。
startActionMode
在该onActivityCreated
方法中工作正常。但是在onActivityCreated
方法之外,活动返回 null,因此activity?.startActionMode(mActionModeCallback)
不起作用。
package com.akshat.music
import android.app.Activity
import android.content.ContentUris
import android.content.Context
import android.net.Uri
import android.os.Bundle
import android.provider.MediaStore
import android.util.Log
import android.view.*
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.fragment_songs.*
import java.io.File
class SongsFragment : Fragment(), SongListAdapter.OnItemClickListener{
private val allSongs = ArrayList<Songs>()
var activityRef: FragmentActivity? = null
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
activityRef = activity;
if (activityRef == null)
Log.d("MIKE", " $activityRef is empty");
else
Log.d("MIKE", " $activityRef is not empty");
recyclerView.apply {
layoutManager = LinearLayoutManager(activity)
adapter = SongListAdapter(allSongs, SongsFragment().apply { this@SongsFragment })
}
activity?.startActionMode(mActionModeCallback) // works
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
getAudioDirectories()
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater!!.inflate(R.layout.fragment_songs, container, false);
}
override fun onItemClicked(song: Songs, position: Int) {
if (activityRef == null)
Log.d("MIKE", " $activityRef is empty");
else
Log.d("MIKE", " $activityRef is not empty");
activity?.startActionMode(mActionModeCallback) // doesn't work
activityRef?.startActionMode(mActionModeCallback) // activityRef is null
}
private val mActionModeCallback: ActionMode.Callback =
object : ActionMode.Callback {
override fun onCreateActionMode(
actionMode: ActionMode,
menu: Menu
): Boolean {
val menuInflater = actionMode.menuInflater
menuInflater.inflate(R.menu.contextual_action_bar, menu)
return true
}
override fun onPrepareActionMode(
actionMode: ActionMode,
menu: Menu
): Boolean {
return false
}
override fun onActionItemClicked(
actionMode: ActionMode,
menuItem: MenuItem
): Boolean {
return false
}
override fun onDestroyActionMode(actionMode: ActionMode) {
var actionMode: ActionMode? = actionMode
actionMode = null
}
}
private fun getAudioDirectories() {
/////////////
}
}
}
如何获得对onActivityCreated
方法外活动的参考?谢谢
解决方案
您可以将上下文转换为 Activity 并从那里调用它,例如
override fun onItemClicked(song: Songs, position: Int) {
...
(requireContext() as Activity).startActionMode(mActionModeCallback)
}
推荐阅读
- html - 尝试仅使用 jquery ajax 在 mvc web api 项目中上传图像
- amazon-web-services - 在端点上调用 create_monitoring_schedule 时 Sagemaker 端点无效
- c - 为什么每当我在 VSCode 上运行 mycode 时会出现此“gcc.exe:错误:数组:没有这样的文件或目录”消息?
- sql - sql中行的成对交换
- python - 如何在顶层和子命令之间共享参数
- javascript - React 动态表和嵌套映射
- three.js - 如何从 ThreeJS 中的 BufferGeometry 中获取单击的几何图形的名称属性?
- c - MQTT paho 库中的有效负载是否有限制?
- emacs - 构建包给出:单个文件模板与包名称不匹配
- javascript - 在另一个 div 中创建一个可拖动的 div