Search code examples
androidandroid-studiokotlinandroid-fragmentsandroid-viewpager

Open ViewPager In Fragment Make App Crash


I am Working on an Layout that Implements View-pager on the Fragment, the Problem comes as I Implemented the View-pager Layout on the Fragment. As I open the View-pager Main Fragment from Bottom Navigation, the App Got Crash and Show Nothing in It. Here is the Xml File Main Fragment Where I Implemented View-pager.. This Layout is Implemented after Linear Layout

<com.google.android.material.tabs.TabLayout
android:id="@+id/tablayout"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<androidx.viewpager.widget.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />

Here is Main Fragment Kotlin File

class ViewPagerFragmentMain : Fragment() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val viewPager: ViewPager = view!!.findViewById(R.id.viewpager)
    val tabLayout: TabLayout = view!!.findViewById(R.id.tablayout)

    // attach tablayout with viewpager

    tabLayout.setupWithViewPager(viewPager)

    val adapter = ViewPagerAdapter(childFragmentManager)

    // add your fragments

    // add your fragments
    adapter.addFrag(FragmentViewPagerHistory(), "Tab1")
    adapter.addFrag(FragmentViewPagerHistorySecond(), "Tab2")
    // set adapter on viewpager

    // set adapter on viewpager
    viewPager.adapter = adapter


}

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_view_pager_main, container, false)
}

From Main Activity i am Calling this Method to open Fragment

 private fun ShowFragmentViewPager() {
    val newFragment: Fragment = ViewPagerFragmentMain()
    val transaction1: FragmentTransaction = supportFragmentManager.beginTransaction();
    transaction1.replace(R.id.frameLayout, newFragment);
    transaction1.addToBackStack(null);
    transaction1.commit();
}

Image Wher i attached Debugger

The Debugger Results Are Like this Result 1

App Closed

In Logcat it shows Nothing Locat

I am Unable to Understand What I did Wrong...

[https://stackoverflow.com/questions/32356867/app-crashes-viewpager][5]

After Implemened the Change the Code Look like this Code after Change


Solution

  • You need to learn about lifecycle of Fragment. The code you have written in onCreate(), must be in onViewCreated(). Or in onCreateView(), after setting the view. So basically

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    
        val viewPager: ViewPager = view!!.findViewById(R.id.viewpager)
        val tabLayout: TabLayout = view!!.findViewById(R.id.tablayout)
    
        // attach tablayout with viewpager
    
        tabLayout.setupWithViewPager(viewPager)
    
        val adapter = ViewPagerAdapter(childFragmentManager)
    
        // add your fragments
    
        // add your fragments
        adapter.addFrag(FragmentViewPagerHistory(), "Tab1")
        adapter.addFrag(FragmentViewPagerHistorySecond(), "Tab2")
        // set adapter on viewpager
    
        // set adapter on viewpager
        viewPager.adapter = adapter
    } 
    

    The above code is causing the null pointer exception. Because in onCreate() view would not be ready and you are trying to access the view.


    Update after onCreateView() mess

    You need to write code in onCreateView() like below

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val rootView = inflater.inflate(R.layout.fragment_view_pager_main, container, false)
    
        val viewPager: ViewPager = rootView.findViewById(R.id.viewpager)
        val tabLayout: TabLayout = rootView.findViewById(R.id.tablayout)
    
        // attach tablayout with viewpager
    
        tabLayout.setupWithViewPager(viewPager)
    
        val adapter = ViewPagerAdapter(childFragmentManager)
    
        // add your fragments
    
        // add your fragments
        adapter.addFrag(FragmentViewPagerHistory(), "Tab1")
        adapter.addFrag(FragmentViewPagerHistorySecond(), "Tab2")
        // set adapter on viewpager
    
        // set adapter on viewpager
        viewPager.adapter = adapter
        
        return rootView
    }