Does anyone faced this problem? Its happen on Main...
# android
s
Does anyone faced this problem? Its happen on MainActivity (MainScreen) I have research lots of solution but not work : https://stackoverflow.com/questions/28071349/the-specified-child-already-has-a-parent-you-must-call-removeview-on-the-chil Code: https://paste.gapo.vn/?cc82336a550e5d11#D6gYWyWvJCXRxAJWbHmWA77b8PPEB2hV95JABNgmyFhC
Copy code
<activity
    android:name=".view.MainActivity"
    android:screenOrientation="portrait"
    android:windowSoftInputMode="stateAlwaysHidden" />
Copy code
Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
        at android.view.ViewGroup.addViewInner(ViewGroup.java:4915)
        at android.view.ViewGroup.addView(ViewGroup.java:4746)
        at androidx.viewpager.widget.ViewPager.addView(ViewPager.java:1485)
        at android.view.ViewGroup.addView(ViewGroup.java:4686)
        at android.view.ViewGroup.addView(ViewGroup.java:4659)
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:326)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1199)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1368)
        at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1446)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1509)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2637)
        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2589)
        at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:247)
        at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:541)
        at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:201)
        at com.gg.gapo.view.MainActivity.onStart(MainActivity.kt:1213)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1334)
        at android.app.Activity.performStart(Activity.java:6992)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2785)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2897) 
        at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4769) 
        at android.app.ActivityThread.-wrap18(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1604) 
        at android.os.Handler.dispatchMessage(Handler.java:105) 
        at android.os.Looper.loop(Looper.java:251) 
        at android.app.ActivityThread.main(ActivityThread.java:6572) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
g
Hard to say anything without code, this SO has answers for different cases when this error may happen
s
https://paste.gapo.vn/?cc82336a550e5d11#D6gYWyWvJCXRxAJWbHmWA77b8PPEB2hV95JABNgmyFhC Thanks @gildor, sr about that, I have to paste it on link below.
g
It’s a lot of code %)
s
@gildor: log said at line 1213 but I can not figure anythings about this code. I have struggle around a month for this issue.
My tracking on firebase said it often happen on background or different screen like PostDetails etc.
g
your activity tries to restore fragment, that is, maybe you somehow reuse view which created by fragment
s
do you mean fragments in viewpager?
g
yes, some fragment, see, fragment manager tries to restore some fragemnt
s
@gildor do you have any suggestion for this issues? If I put all fragments to ArrayList as global variable, do you think it can resolve this problem ? Thanks.
Copy code
private val fragments = arrayListOf<Fragment>()

private inner class HomePagerAdapter internal constructor(fm: FragmentManager) :
            FragmentStatePagerAdapter(fm) {
        private var currentPrimary = -1
        override fun getItem(position: Int): Fragment {
            return fragments[position]
        }


        override fun setPrimaryItem(container: ViewGroup, position: Int, `object`: Any) {
            if (currentPrimary != position) {
                currentPrimary = position
                fragments[position].userVisibleHint = true
                if(position == 1 && fragments[position] is VideoFragment){
                    (fragments[position] as VideoFragment).init()
                }
                }

        }

        override fun getCount(): Int {
            return fragments.size
        }

        override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
            super.destroyItem(container, position, `object`)
        }
    }
Copy code
private  fun initFragments(){
        val initFeedIndex = if (CommonPreferences.getFeedPriority(this@MainActivity) != FeedPriority.NONE.type) {
            CommonPreferences.getFeedPriority(this@MainActivity)
        } else {
            intent?.getIntExtra(EXTRA_DEFAULT_FEED_INDEX, FEED_INDEX.DISCOVER.index)
                    ?: FEED_INDEX.DISCOVER.index
        }
        fragments.add(0,NewsfeedFollowFragment.newInstance(initFeedIndex))
        fragments.add(1,VideoFragment.newInstance())
        fragments.add(2,ConversationFragment.newInstance(false))
        fragments.add(3,NotificationFragment.newInstance())
        fragments.add(4,AccountFragment.newInstance(UserPreferencies.getUserId(), showBack = false,loadInstantly = true, accountListener = null, startScreenName = ScreenName.SCREEN_TAB_PROFILE_NEW_FEED.type))
g
Caching fragments is always wrong
You shouldn't cache them, only create them when it created, don't forget fragment is recreated automatically on restore state
I don't have any particular recommendation, too many things happening in your code, it looks that you reuse fragment or view when you shouldn't, or maybe you create fragment every time manually, instead of getting existing one, created by fragment manager
s
Thanks @gildor