繁体   English   中英

Kotlin 片段:活动在 onActivityCreated 之外返回 null

[英]Kotlin fragment : activity returns null outside onActivityCreated

我正在尝试在片段中使用startActionMode

startActionModeonActivityCreated方法中工作正常。 但在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)
}

您应该能够从片段内的任何位置获取对活动的引用。 在某些情况下,活动可以是 null 例如在onDetach()OnCreateView()内部,因此活动并不总是需要一个值。

尝试使用 Stachu 提到的 requireContext() :

    (requireContext() as Activity).startActionMode(mActionModeCallback)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM