【问题标题】:Kotlin fragment : activity returns null outside onActivityCreatedKotlin 片段:活动在 onActivityCreated 之外返回 null
【发布时间】:2020-08-06 08:04:21
【问题描述】:

我正在尝试在片段中使用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 方法之外的活动参考? 谢谢

【问题讨论】:

  • 要在 androidx.fragment 中获取 Activity,您应该使用 requireActivity() 方法。如果片段附加到活动,则返回活动。奇怪的是为什么你在onItemClicked 中得到null 也许你从getAudioDirectories 调用这个方法,即在调用onAttach() 之前。

标签: android kotlin android-fragments android-activity android-fragmentactivity


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,但是在使用它时,我收到错误消息:Fragment SongsFragment{da808fa (17ea0969-4885-4eb9-a8f1-4776ad2521a4)} not attach to an activity
  • m.. 这很奇怪。
  • 尝试使用onAttach()方式:override fun onAttach(context: Context) { super.onAttach(context) activityRef = (context as MainActivity) }
【解决方案2】:

您可以将上下文转换为 Activity 并从那里调用它,例如

override fun onItemClicked(song: Songs, position: Int) {
    ...
    (requireContext() as Activity).startActionMode(mActionModeCallback)
}

【讨论】:

  • 谢谢,但是在使用这个时,我得到错误:Fragment SongsFragment{da808fa (17ea0969-4885-4eb9-a8f1-4776ad2521a4)} not attached to an activity.
  • 如何为这个片段充气?如果操作正确,它应该附加到活动中,请参阅此处stackoverflow.com/questions/50257505/…
  • 我使用了以下代码:private fun showSongsFragment() { val transaction = manager.beginTransaction() val fragment = SongsFragment() transaction.replace(R.id.fragmentHolder, fragment) transaction.addToBackStack(null) transaction.commit() }
  • 你从活动中调用它,对吗?或者也许来自其他片段?你如何实例化manager
  • 我从 Activity 调用它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多