Задать вопрос
Xandr24
@Xandr24
учиться и еще раз учиться

Почему фрагмент накладывается на другой фрагмент при replace?

Друзья, всем привет!
Помогите разобраться в следующей ситуации пожалуйста!
Я нахожусь в homeFragment, из него я хочу запустить contentFragment. Все запускается, но фрагменты накладываются друг на друга! Как видно на скриншоте идет наслоение. На одном фрагменте TextView показывает Home Fragment а на втором Я крутой контент.
622cdf2ecaed9639361678.png
Вот код фрагмента из которого вызывается другой
class HomeFragment: Fragment() {

    private lateinit var Quotes: TextView
    private var _binding: FragmentHomeBinding? = null
    private val binding: FragmentHomeBinding
    get() = _binding ?: throw RuntimeException("FragmentHomeBinding is null")

    override fun onAttach(context: Context) {
        super.onAttach(context)
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding = FragmentHomeBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        initViews(view)
        addListeners(view)
    }

    private fun initViews(view: View){
        Quotes = view.findViewById(R.id.textViewQuotes)
    }

    private fun addListeners(view: View){
        view.setOnClickListener {
            if (binding.textViewQuotes.id.toString() == R.id.textViewQuotes.toString()){

                requireActivity().supportFragmentManager.beginTransaction()
                    .replace(R.id.homeFragment, ContentFragment.newInstance())
                    .commit()
            }
        }
    }
}

А вот код фрагмента, который вызывается
class ContentFragment: Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.content_fragment, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
    }

    companion object {
        fun newInstance(): Fragment {
            return ContentFragment()
        }
    }
  • Вопрос задан
  • 394 просмотра
Подписаться 1 Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 1
zagayevskiy
@zagayevskiy Куратор тега Kotlin
Android developer at Yandex
Ну, собственно, всё понятно.
transaction.replace(R.id.frame_layout, fragment)


и

.replace(R.id.homeFragment, ContentFragment.newInstance())


Ты реплейсишь фрагменты в разные контейнеры. Поэтому они находятся на экране одновременно. Должен быть один и тот же контейнер.

Дальше правила хорошего тона:
Фрагмент(в твоем случае — HomeFragment) не имеет морального права брать активити и пихать что-то в её фрагмент менеджер. Это не его ответственность. Тем более он не имеет права закладываться, что в разметке активити есть вьюхи с определенным айди. Максимум он может скастовать активити к какому-то интерфейсу и попросить её что-то сделать:
(requireActivity() as? CallbackInterface)?.showContentPlease(your awesome content)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы