I am using viewpager2 with a tab layout, I have set up the hilt config in my project, and this crash is reproduced when 2nd time when page reload
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter
import com.google.android.material.tabs.TabLayoutMediator
import com.zig.gps.R
import com.zig.gps.databinding.TabLayoutBinding
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class TabLayoutDemo : Fragment() {
private var _binding: TabLayoutBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = TabLayoutBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//renderViewPager
binding.viewpager.adapter = object : FragmentStateAdapter(this) {
override fun createFragment(position: Int): Fragment {
return ResourceStore.pagerFragments[position]
}
override fun getItemCount(): Int {
return ResourceStore.tabList.size
}
}
TabLayoutMediator(binding.tabs, binding.viewpager) { tab, position ->
tab.text = getString(ResourceStore.tabList[position])
}.attach()
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
interface ResourceStore {
companion object {
val tabList = listOf(
R.string.Dashboard, R.string.Tracking, R.string.Fastags,R.string.Reports, R.string.Documents, R.string.Maintance, R.string.Alerts, R.string.Device
)
//do it like:
//val anotherFrament = DashboardNew.create()
val pagerFragments = listOf(
DashboardNew.create() ,
DashboardNew.create() ,
DashboardNew.create() ,
DashboardNew.create() ,
DashboardNew.create() ,
DashboardNew.create() ,
DashboardNew.create() ,
DashboardNew.create() )
}
}
Here is my fragment
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class DashboardNew : Fragment() {
private var _binding: UserDashboardNewBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!
val viewModel: DashboardViewModel by viewModels()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?,
): View {
_binding = UserDashboardNewBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
}
companion object {
fun create(): DashboardNew {
return DashboardNew()
}
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
Here is my crash:
FATAL EXCEPTION: main Process: com.zig.gps, PID: 13163 java.lang.IllegalStateException: onAttach called multiple times with different Context! Hilt Fragments should not be retained. at dagger.hilt.internal.Preconditions.checkState(Preconditions.java:83) at com.zig.gps.view.Hilt_DashboardNew.onAttach(Hilt_DashboardNew.java:58) at androidx.fragment.app.Fragment.onAttach(Fragment.java:1881) at com.zig.gps.view.Hilt_DashboardNew.onAttach(Hilt_DashboardNew.java:47) at androidx.fragment.app.Fragment.performAttach(Fragment.java:3063) at androidx.fragment.app.FragmentStateManager.attach(FragmentStateManager.java:464) at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:254) at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1890) at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1808) at androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1720) at androidx.fragment.app.BackStackRecord.commitNow(BackStackRecord.java:317) at androidx.viewpager2.adapter.FragmentStateAdapter.placeFragmentInViewHolder(FragmentStateAdapter.java:341) at androidx.viewpager2.adapter.FragmentStateAdapter.onViewAttachedToWindow(FragmentStateAdapter.java:276) at androidx.viewpager2.adapter.FragmentStateAdapter.onViewAttachedToWindow(FragmentStateAdapter.java:67) at androidx.recyclerview.widget.RecyclerView.dispatchChildAttached(RecyclerView.java:7556) at androidx.recyclerview.widget.RecyclerView$5.addView(RecyclerView.java:860) at androidx.recyclerview.widget.ChildHelper.addView(ChildHelper.java:107) at androidx.recyclerview.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:8601) at androidx.recyclerview.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8559) at androidx.recyclerview.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8547) at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1641) at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587) at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665) at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134) at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3851) at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4404) at android.view.View.layout(View.java:23126) at android.view.ViewGroup.layout(ViewGroup.java:6479) at androidx.viewpager2.widget.ViewPager2.onLayout(ViewPager2.java:527) at android.view.View.layout(View.java:23126) at android.view.ViewGroup.layout(ViewGroup.java:6479) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673) at android.widget.LinearLayout.onLayout(LinearLayout.java:1582) at android.view.View.layout(View.java:23126) at android.view.ViewGroup.layout(ViewGroup.java:6479) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332) at android.widget.FrameLayout.onLayout(FrameLayout.java:270) at android.view.View.layout(View.java:23126) at android.view.ViewGroup.layout(ViewGroup.java:6479) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332) at android.widget.FrameLayout.onLayout(FrameLayout.java:270) at android.view.View.layout(View.java:23126) at android.view.ViewGroup.layout(ViewGroup.java:6479) at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1762) at android.view.View.layout(View.java:23126) at android.view.ViewGroup.layout(ViewGroup.java:6479) at com.google.android.material.appbar.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:148) at com.google.android.material.appbar.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:43) 2022-10-22 12:10:02.529 13163-13163 AndroidRuntime
com.zig.gps E at com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:2227) at androidx.coordinatorlayout.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:918) at android.view.View.layout(View.java:23126) at android.view.ViewGroup.layout(ViewGroup.java:6479) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332) at android.widget.FrameLayout.onLayout(FrameLayout.java:270) at android.view.View.layout(View.java:23126) at android.view.ViewGroup.layout(ViewGroup.java:6479) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673) at android.widget.LinearLayout.onLayout(LinearLayout.java:1582) at android.view.View.layout(View.java:23126) at android.view.ViewGroup.layout(ViewGroup.java:6479) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332) at android.widget.FrameLayout.onLayout(FrameLayout.java:270) at android.view.View.layout(View.java:23126) at android.view.ViewGroup.layout(ViewGroup.java:6479) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673) at android.widget.LinearLayout.onLayout(LinearLayout.java:1582) at android.view.View.layout(View.java:23126) at android.view.ViewGroup.layout(ViewGroup.java:6479) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332) at android.widget.FrameLayout.onLayout(FrameLayout.java:270) at com.android.internal.policy.DecorView.onLayout(DecorView.java:804) at android.view.View.layout(View.java:23126) at android.view.ViewGroup.layout(ViewGroup.java:6479) at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:3630) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3089) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2079) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8526) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1077) at android.view.Choreographer.doCallbacks(Choreographer.java:897) at android.view.Choreographer.doFrame(Choreographer.java:826) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1062) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:233) at android.app.ActivityThread.main(ActivityThread.java:8052) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)
Hilt onAttach called multiple times with different Contexts! Hilt Fragments should not be retained
Source code: https://github.com/BoltUIX/Hilt-Demo-Viewpager-with-tablayout
Crash Reproduce: https://github.com/BoltUIX/Hilt-Demo-Viewpager-with-tablayout/blob/main/22-11-02-14-00-40.mp4