https://kotlinlang.org logo
Title
s

Sam

07/23/2020, 2:05 AM
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
<activity
    android:name=".view.MainActivity"
    android:screenOrientation="portrait"
    android:windowSoftInputMode="stateAlwaysHidden" />
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

gildor

07/23/2020, 2:09 AM
Hard to say anything without code, this SO has answers for different cases when this error may happen
s

Sam

07/23/2020, 2:15 AM
https://paste.gapo.vn/?cc82336a550e5d11#D6gYWyWvJCXRxAJWbHmWA77b8PPEB2hV95JABNgmyFhC Thanks @gildor, sr about that, I have to paste it on link below.
g

gildor

07/23/2020, 2:16 AM
It’s a lot of code %)
s

Sam

07/23/2020, 2:20 AM
@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

gildor

07/23/2020, 2:25 AM
your activity tries to restore fragment, that is, maybe you somehow reuse view which created by fragment
s

Sam

07/23/2020, 2:27 AM
do you mean fragments in viewpager?
g

gildor

07/23/2020, 2:37 AM
yes, some fragment, see, fragment manager tries to restore some fragemnt
s

Sam

07/23/2020, 4:24 AM
@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.
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`)
        }
    }
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

gildor

07/23/2020, 4:39 AM
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

Sam

07/23/2020, 4:56 AM
Thanks @gildor