Usman Ali
Usman Ali

Reputation: 433

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

Upvotes: 0

Views: 773

Answers (1)

Pankaj Kumar
Pankaj Kumar

Reputation: 82958

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
}

Upvotes: 1

Related Questions