1
resposta

Como mudar efeito de tablayout de uma activity para fragment

Galera eu tenho essa função abaixo rodando perfeitamente em minha activity, porém quando eu coloco o mesmo dentro de um fragment ele para de funcionar. Sou novo no mundo android e gostaria de saber como faço pra fazer essa migraçao e o que eu preciso entender.

Aparentemente o mesmo não está funcionado devido ao "supportFragmentManager" o que estou fazendo de errado?

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val tabLayout: TabLayout = findViewById(R.id.tabs)
        val viewpager: ViewPager = findViewById(R.id.viewpager)
        val viewPagerAdapter = ViewPagerAdapter(supportFragmentManager)

        viewPagerAdapter.addFragment(Fragment1(),"home")
        viewPagerAdapter.addFragment(Fragment2(),"chat")
        viewPagerAdapter.addFragment(Fragment3(),"setting")

        viewpager.adapter = viewPagerAdapter
        tabLayout.setupWithViewPager(viewpager)
    }

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        return super.onCreateOptionsMenu(menu)
    }

    internal class ViewPagerAdapter(fragmentManager: FragmentManager) : FragmentPagerAdapter(fragmentManager)
    {
        private val fragments: ArrayList<Fragment>
        private val titles: ArrayList<String>

        init {
            fragments = ArrayList<Fragment>()
            titles = ArrayList<String>()
        }

        override fun getCount(): Int {
            return fragments.size
        }

        override fun getItem(position: Int): Fragment {
            return fragments[position]
        }

        fun addFragment(fragment: Fragment,title: String)
        {
            fragments.add(fragment)
            titles.add(title)
        }

        override fun getPageTitle(position: Int): CharSequence? {
            return titles[position]
        }

    }

XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">

<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/black"
    android:minHeight="?attr/actionBarSize"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

<com.rd.PageIndicatorView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="10dp"
    app:piv_radius="4dp"
    app:piv_unselectedColor="@color/black"
    app:piv_viewPager="@id/viewpager" />

<com.google.android.material.tabs.TabLayout
    android:id="@+id/tabs"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    app:tabBackground="@color/black"
    app:tabGravity="fill"
    app:tabMode="fixed"
    app:tabTextColor="@color/purple_500"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

<androidx.viewpager.widget.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

</LinearLayout>
1 resposta

Olá, Thailan! Tudo bem?

Para migrar o código da sua Activity para um Fragment, você precisa fazer algumas alterações. Primeiramente, você precisa substituir o suporte ao FragmentManager pelo getChildFragmentManager() dentro do seu Fragment.

Além disso, você precisa ter certeza de que está usando o FragmentPagerAdapter correto, que é o androidx.fragment.app.FragmentPagerAdapter.

Segue abaixo um exemplo de como ficaria o código do seu Fragment com essas alterações:

class MeuFragment : Fragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view = inflater.inflate(R.layout.fragment_meu, container, false)

        val tabLayout: TabLayout = view.findViewById(R.id.tabs)
        val viewPager: ViewPager = view.findViewById(R.id.viewpager)
        val viewPagerAdapter = ViewPagerAdapter(childFragmentManager)

        viewPagerAdapter.addFragment(Fragment1(),"home")
        viewPagerAdapter.addFragment(Fragment2(),"chat")
        viewPagerAdapter.addFragment(Fragment3(),"setting")

        viewPager.adapter = viewPagerAdapter
        tabLayout.setupWithViewPager(viewPager)

        return view
    }

    internal class ViewPagerAdapter(fragmentManager: FragmentManager) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)
    {
        private val fragments: ArrayList<Fragment>
        private val titles: ArrayList<String>

        init {
            fragments = ArrayList<Fragment>()
            titles = ArrayList<String>()
        }

        override fun getCount(): Int {
            return fragments.size
        }

        override fun getItem(position: Int): Fragment {
            return fragments[position]
        }

        fun addFragment(fragment: Fragment,title: String)
        {
            fragments.add(fragment)
            titles.add(title)
        }

        override fun getPageTitle(position: Int): CharSequence? {
            return titles[position]
        }

    }
}

Lembre-se de alterar o nome do seu Fragment e o nome do seu layout para os correspondentes ao seu projeto.

Espero ter ajudado e bons estudos!