Reputation: 433
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();
}
The Debugger Results Are Like this
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
Upvotes: 0
Views: 773
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