Проблема перекрывающихся фрагментов в TabLayout - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть TabLayout с двумя фрагментами, два из которых показывают RecyclerView (один фильм и другой сериал). TabLayout работает отлично, но проблема возникает, когда я нажимаю на изображение фильма. Клик в фильме должен сделать транзакцию во фрагменте фильма. Но когда это происходит, ListFragment с TabLayout появляется под новым, поэтому отображаются оба из них.

My ActivityMain, код, где я вызываю транзакцию и где я устанавливаю адаптер страницы:

override fun onMovieClicked(iDMovie: Int) {

        val movieDetails = MovieDetailsFragment.newInstance(iDMovie)
        supportFragmentManager.
           beginTransaction().
           replace(R.id.main_container, movieDetails).
           addToBackStack(null).
           commit()
    }

private fun setStatePageAdapter() {

        val fragmentAdapter = MyPagerAdapter(supportFragmentManager)
        viewPager.adapter = fragmentAdapter

        tabLayout.setupWithViewPager(viewPager)

    }

Мой PageAdapterClass:

class MyPagerAdapter(fm: FragmentManager): FragmentPagerAdapter(fm) {

   override fun getItem(position: Int): Fragment {
        return when (position) {
            0 -> {
                ListFilmFragment()
            }
            else -> {
                return TVShowsFragmentList()
            }
        }
    }

    override fun getCount(): Int {
        return 2
    }

    override fun getPageTitle(position: Int): CharSequence {
        return when (position) {
            0 -> "Películas"
            else -> {
                return "Series"
            }
        }
    }
}

и макеты: Основная деятельность:

<android.support.design.widget.CoordinatorLayout
    android:id="@+id/main_container"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


<android.support.design.widget.TabLayout
        android:id="@+id/tabLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minHeight="?actionBarSize"
        app:tabGravity="fill"
        app:tabIndicatorHeight="4dp"
        app:tabBackground="@color/black"
        app:tabMode="fixed"
        app:tabTextColor="@color/white"
        app:layout_scrollFlags="scroll|enterAlways">
</android.support.design.widget.TabLayout>

<android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_height="match_parent"
        android:layout_width="match_parent">

</android.support.v4.view.ViewPager>

Наблюдение: с FrameLayout вместо Coordinator тоже не сработало.

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

1 Ответ

0 голосов
/ 25 апреля 2019

Вы можете решить вашу проблему 2 способами

первый: Вы можете скрыть свой ViewPager и TabLayout для раздувания Ваших фрагментов. поэтому измените ваш метод MovieClicked, как показано ниже

override fun onMovieClicked(iDMovie: Int) {

   viewPager.visibiliy=View.Gone;
   tabLayout.visibility=View.Gone
    val movieDetails = MovieDetailsFragment.newInstance(iDMovie)
    supportFragmentManager.
       beginTransaction().
       replace(R.id.main_container, movieDetails).
       addToBackStack(null).
       commit()
}

Seconde: Вы можете изменить свои фрагменты XML Корневые элементы 1-установить фон для каждого из ваших фрагментов android:background="yourColor", чтобы скрыть за макетом. 2 Установите для атрибута OnClick значение true, чтобы приложение получило ваш текущий макет. onClickListeners не за макетом с android:onClick=true

Ваш Xml должен быть как ниже

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:onClick="true"
    android:background="#ffffff"<!--White Color for example-->
>


</android.support.design.widget.CoordinatorLayout>

Если у вас есть несколько фрагментов макета , в которых есть ваша проблема Вы можете установить стиль и изменить стиль фрагмента на свой стиль Итак, объявите стиль в style.xml

<style name="fragmentsRootElementStyle">
    <item name="android:onClick">true</item>
    <item name="android:background">#ffffff</item>
</style>

и установите стиль для корневых макетов фрагментов, как показано ниже

    <android.support.design.widget.CoordinatorLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        style="@style/fragmentsRootElementsStyle"
    >

    </android.support.design.widget.CoordinatorLayout>
...