Открыть фрагмент из другого в kotlin - PullRequest
0 голосов
/ 09 июля 2019

Я совершенно не в себе. Я пытаюсь открыть / заменить фрагмент из одного в другой, и только документы, которые я могу найти, получены из 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)
       }}

Но единственный результат, который я получаю, это второй фрагмент, помещенный в первый, даже если я назову:

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, который загружает фрагмент, внутри этого фрагмента нам нужно загрузить еще один при событии щелчка. Таким образом, фрагмент для замены - это не текущий фрагмент, а содержимое main_activity.xml.

Спасибо всем за ваши быстрые ответы

Ответы [ 3 ]

2 голосов
/ 09 июля 2019

Это просто, как в действии, просто сделай это так.

 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    childFragmentManager.beginTransaction().replace(R.id.action_container,ChildFragment.getInstance()).commit()
}
0 голосов
/ 09 июля 2019

Если вы используете фрагмент, вы можете получить контекст действия и извлечь из него менеджер фрагментов.Итак, внутри вашего класса фрагмента сделайте это

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

Не то, чтобы у вас был менеджер фрагментов, вам нужен только идентификатор контейнера, в который вы хотите добавить / заменить ваш другой фрагмент, и вы готовы к работе.

fm.beginTransaction().add(R.layout.container_id, OtherFragmentObject()).commit();
0 голосов
/ 09 июля 2019

Используйте приведенный ниже порядок функций для добавления или замены любого фрагмента

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
                    )

Оба вызова метода одинаковы, единственное отличие - активность? .supportFragmentManager, который должен быть ненулевым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...