簡體   English   中英

在 kotlin 中打開另一個片段

[英]Open fragment from another one in kotlin

我完全絕望了。 我嘗試從一個片段到另一個片段打開/替換,只有我能找到的文檔來自 Activity 或僅在 Java 中(使用 getFragmentManager() 方法,在 Kotlin 中似乎不存在)。

supportFragmentManager 僅在 Activity 內可用,我使用的是片段和適配器。

請你幫助我好嗎?

我認為除非顯示我的代碼,因為它什么都不提供,只有錯誤

沒有一個答案對我有用。 我嘗試了其他方法並創建了一個界面:

interface AdapterCallbackAlbum {
fun onClickItem(album: Album)}

並在我的第一個片段中實現它

class ListAlbumsFragment : Fragment(), AdapterCallbackAlbum {
  override fun onClickItem(album: Album) {
  val fragment = ListTracksFragment.newInstance()
  val transaction = childFragmentManager.beginTransaction()
  transaction.replace(R.id.album_fragment, fragment)
  transaction.commit()
}

最后是適配器:

    class AlbumAdapter(val context: Context, private val 
    adapterCallbackAlbum: AdapterCallbackAlbum): Adapter<ViewHolder>() {
    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, 
    position: Int) {
        val album = albumList[position]
        holder.itemView.setOnClickListener { 
          adapterCallbackAlbum.onClickItem(album)
       }}

但我得到的唯一結果是第二個片段放在第一個片段上,即使我調用 a :

transaction.remove(ListAlbumFragment.newInstance())

我的一個朋友終於解決了我的問題(也許它可以幫助某人)。

 override fun onClickItem(album: Album) {
    val fragment = ListTracksFragment.newInstance()
    val transaction = fragmentManager.beginTransaction()
    transaction.replace(R.id.content, fragment)
    transaction.addToBackStack(null)
    transaction.commit()
}

問題是我們從 MainActivity 開始,它加載一個片段,在這個片段中,我們必須在點擊事件上加載另一個片段。 所以要替換的fragment不是當前fragment,而是main_activity.xml的內容。

感謝大家的快速回答

這很簡單,因為它在活動中就這樣做。

 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    childFragmentManager.beginTransaction().replace(R.id.action_container,ChildFragment.getInstance()).commit()
}

使用下面的函數來添加或替換任何片段

fun addFragment(
fm: FragmentManager,
fragment: Fragment,
container: Int,
replace: Boolean,
addToBackStack: Boolean,
addAnimation: Boolean
) {
val fragmentTransaction = fm.beginTransaction()
if (addAnimation)
    fragmentTransaction.setCustomAnimations(
        R.animator.slide_in_rght,
        R.animator.slide_out_left,
        R.animator.slide_in_left,
        R.animator.slide_out_rght
    )
if (replace)
    fragmentTransaction.replace(container, fragment, fragment.javaClass.name)
else
    fragmentTransaction.add(container, fragment, fragment.javaClass.name)
if (addToBackStack)
    fragmentTransaction.addToBackStack(fragment.javaClass.name)
 fragmentTransaction.commit()
}

在你想要打開另一個片段的片段類中,你可以調用上面的函數:

fragmentManager?.let {
                        addFragment(
                            it, ABCFragment(), android.R.id.content, false,  true,
                            true
                        )
                    }

或者

addFragment(
                        activity?.supportFragmentManager
                        , SignupFinalStepFragment.newInstance(
                            phoneNumber = phoneNumber?:"",
                            emailAddress = emailAddress ?: ""
                        ), android.R.id.content, false, addToBackStack = true,
                        addAnimation = true
                    )

兩個方法調用是相同的,唯一的區別是 activity?.supportFragmentManager 應該是非 null 。

如果您使用的是 Fragment,則可以獲取 Activity 的上下文並從中檢索 Fragment 管理器。 因此,在您的片段類中執行此操作

FragmentManager fm = ((Activity) getContext).getSupportFragmentManager();

並不是說您有片段管理器,您只需要要添加/替換其他片段的容器的 ID,就可以了。

fm.beginTransaction().add(R.layout.container_id, OtherFragmentObject()).commit();

在您的 CurrentFragment 中,像這樣覆蓋 onActivityCreated:

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)

    yourOwnButton.setOnClickListener{

        requireActivity().supportFragmentManager.beginTransaction()
            .replace(R.id.your_fragment_container, AnotherFragment.newInstance())
            .commit()
    }
}

在您的 AnotherFragment 中,您應該有一個像這樣的伴生對象:

companion object {
    fun newInstance() = StudentFragment()
}
   //try it 
    fun commitFragmenttoFragment(fragmentManager: FragmentManager, fragment: Fragment, tag: String) {
            val fragmentTransaction = fragmentManager.beginTransaction()
            fragmentTransaction.replace(R.`enter code here`id.fragment_main, fragment)
            fragmentTransaction.addToBackStack(null)
            fragmentTransaction.commit()
        }

    //in this fragment us activity!!.supportFragmentManager

    commitFragmenttoFragment(activity!!.supportFragmentManager,AddManageValue(), AddManageValue().TAG)

如果有人關心,我將這段代碼放在我的片段上后,將第二個片段更改為FrameLayout

 childFragmentManager.beginTransaction()
            .replace(R.id.mFragment,secondFragment())
            .commit()

以下是在 kotlin 中從一個片段導航到另一個片段的方法:

<fragment
        android:id="@+id/titleFragment"
        android:name="com.dheeraj.guessbro.title.TitleFragment"
        android:label="title_fragment"
        tools:layout="@layout/title_fragment">
       <action
            android:id="@+id/action_titleFragment_to_gameFragment"
            app:destination="@id/gameFragment" />
    </fragment>

然后轉到 TitleFragment.kt 文件並使用以下代碼:

binding.btn_open.setOnClickListener { findNavController(this).navigate(R.id.action_titleFragment_to_gameFragment) }

如果您不使用視圖綁定,那么您可以先使用 findViewById 定義變量,然后使用 clickListener。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM