【发布时间】:2020-08-06 08:04:21
【问题描述】:
我正在尝试在片段中使用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 方法之外的活动参考?
谢谢
【问题讨论】:
-
要在 androidx.fragment 中获取 Activity,您应该使用
requireActivity()方法。如果片段附加到活动,则返回活动。奇怪的是为什么你在onItemClicked中得到null也许你从getAudioDirectories调用这个方法,即在调用onAttach()之前。
标签: android kotlin android-fragments android-activity android-fragmentactivity