0

I want to display my TabLayout in my fragment, but he want nullable supportFragmentManager:

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val fragmentAdapter = MyPagerAdapter(activity?.supportFragmentManager)
        viewpager_main.adapter = fragmentAdapter

        tabs_main.setupWithViewPager(viewpager_main)
    }

Here is my adapter:

import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
import com.mandarine.targetList.features.targets.list.TargetsFragment

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

    override fun getItem(position: Int): Fragment {
        return when (position) {
            0 -> {
                TargetsFragment()
            }
            1 -> SecondFragment()
            else -> {
                return FirstFragment()
            }
        }
    }

    override fun getCount(): Int {
        return 3
    }

    override fun getPageTitle(position: Int): CharSequence {
        return when (position) {
            0 -> "First Tab"
            1 -> "Second Tab"
            else -> {
                return "Third Tab"
            }
        }
    }
}

How i can rewrite my val?

val fragmentAdapter = activity?.supportFragmentManager?.let { MyPagerAdapter(it) }

java.lang.IllegalStateException: viewpager_main must not be null

Also FragmentPagerAdapter is deprecated, mb need to use smth new?

Morozov
  • 4,968
  • 6
  • 39
  • 70
  • you need to access your view in fragment in `onViewCreated` not in `onCreate` – Mohammed Alaa Jan 03 '20 at 11:41
  • @MohammedAlaa but if i write `val fragmentAdapter = activity?.supportFragmentManager` in onViewCreated i get nullable fragmentAdapter – Morozov Jan 03 '20 at 11:41
  • yes but this is normal check [this](https://www.reddit.com/r/androiddev/comments/aklpz4/why_does_getactivity_in_fragment_might_be_null/) – Mohammed Alaa Jan 03 '20 at 11:48

1 Answers1

1

getActivity() can be null while your fragment is in process of preparation and about to be ready. usually this happens in OnCreate while in OnViewCreated, view is already generated and activity will never be null here

Assign viewpager adapter in onViewCreated

Define both globally to use it anywhere in the class

    private lateinit var viewpager_main: ViewPager
    private lateinit var myPagerAdapter :MyPagerAdapter


override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
 viewpager_main= view.findViewById(R.id.viewpager_main)
myPagerAdapter = MyPagerAdapter(activity!!.supportFragmentManager)
}

Try this

Check the to know about !! and ? in kotlin The difference between !! and ? in Kotlin

Amanpreet Kaur
  • 440
  • 6
  • 13