Fragment已经被added了导致的异常。

 

java.lang.IllegalStateException: Fragment already added:  ******Effect

 

出现的原因是commit方法提交是异步的,所以容易出现,判断的时候是还没有added的状态,但是在真的添加的时候,重复添加了,其实就是一个同步异步的问题。

解决方式其实就是自己添加一个tag,每个fragment一个tag就可以解决重复添加导致的异常了。

mAdded = new boolean[]{false, false, false, false, false, false};
private synchronized void setIndexSelected(int index) {
        Logcat.d(TAG, "mIndex " + mIndex + "; index " + index);
        if(mIndex == index){
            return;
        }
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction ft = fragmentManager.beginTransaction();

        //隐藏
        ft.hide(mFragments[mIndex]);
        //判断是否添加
        if (index < mFragments.length) {
            if (!mFragments[index].isAdded() && !mAdded[index]) {
                Logcat.d(TAG, "add " + mFragments[index]);
                ft.add(R.id.content, mFragments[index]).show(mFragments[index]);
                mAdded[index] = true;
            } else {
                Logcat.d(TAG, "show " + mFragments[index]);
                ft.show(mFragments[index]);
            }
        }
        ft.commit();
        //再次赋值
        mIndex = index;
    }

 

 

[2017/7/21 10:42:08] 07-21 05:41:00.457  4835  4835 E AndroidRuntime: java.lang.IllegalStateException: Fragment already added: SoundEffectFragment{acd69f9 #1 id=0x7f0e0205}
[2017/7/21 10:42:08] 07-21 05:41:00.457  4835  4835 E AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1323)
[2017/7/21 10:42:08] 07-21 05:41:00.457  4835  4835 E AndroidRuntime:     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:675)
[2017/7/21 10:42:08] 07-21 05:41:00.457  4835  4835 E AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617)
[2017/7/21 10:42:08] 07-21 05:41:00.457  4835  4835 E AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517)
[2017/7/21 10:42:08] 07-21 05:41:00.457  4835  4835 E AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739)
[2017/7/21 10:42:08] 07-21 05:41:00.457  4835  4835 E AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95)
[2017/7/21 10:42:08] 07-21 05:41:00.457  4835  4835 E AndroidRuntime:     at android.os.Looper.loop(Looper.java:148)
[2017/7/21 10:42:08] 07-21 05:41:00.457  4835  4835 E AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5417)
[2017/7/21 10:42:08] 07-21 05:41:00.457  4835  4835 E AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
[2017/7/21 10:42:08] 07-21 05:41:00.457  4835  4835 E AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:742)
[2017/7/21 10:42:08] 07-21 05:41:00.457  4835  4835 E AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:632)

 

转载于:https://www.cnblogs.com/lipeineng/p/7246215.html

### 回答1: 在Activity中调用Fragment的方法,可以通过以下步骤实现: 1. 获取Fragment的实例对象 在Activity中获取Fragment的实例对象,可以通过FragmentManager的findFragmentById或findFragmentByTag方法来获取。例如: MyFragment myFragment = (MyFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_container); 2. 调用Fragment的方法 获取到Fragment的实例对象后,就可以直接调用Fragment中的方法了。例如: myFragment.doSomething(); 其中,doSomething()是在Fragment中定义的方法。 需要注意的是,如果Fragment还没有被添加到Activity中,调用Fragment的方法会导致空指针异常。因此,在调用Fragment的方法之前,需要先判断Fragment是否已经被添加到Activity中。例如: if (myFragment != null && myFragment.isAdded()) { myFragment.doSomething(); } ### 回答2: Activity是Android应用中的一个重要组件,同时Fragment也是在Android中使用最为广泛的组件之一。Activity可以通过调用Fragment的相关方法来与Fragment进行交互,这种交互方式非常灵活和便捷,使得Activity和Fragment能够更好地协同工作。下面就来详细了解如何在Activity中调用Fragment方法。 1.通过FragmentManager获取Fragment实例 Activity可以通过FragmentManager的findFragmentById或者findFragmentByTag方法获取到指定的Fragment实例。这里需要注意的是,在获取到Fragment实例之前,需要先确认Fragment是否已经添加到Activity中。 2.调用Fragment的方法 获取到Fragment的实例之后,即可通过调用Fragment的公共方法来实现Activity和Fragment的交互。在Fragment中定义的公共方法可以被声明为abstract,interface,static或者public方法。 3.使用接口回调实现Activity与Fragment的交互 除了可以通过直接调用Fragment的方法来实现Activity和Fragment之间的交互,还可以使用接口回调的方式来实现。这种方式不仅可以更好地封装代码,还能够使得Activity和Fragment之间的交互更为灵活和可扩展。 上述内容就是在Activity调用Fragment方法的一些常见方式。总的来说,通过调用Fragment的方法,Activity能够更好地控制Fragment的生命周期、数据和状态等,实现更加优秀的用户体验。而使用接口回调的方式,可以进一步提高代码的可维护性和可扩展性。 ### 回答3: 在Android应用程序开发中,Activity和Fragment是两个重要的组件。Activity负责管理界面和应用程序的生命周期,而Fragment是Activity内部的一个组件,可以独立存在,有自己的生命周期和UI界面。在开发中,我们通常会在Activity中使用Fragment来实现界面的模块化和功能的拆分。 在Fragment中定义了某些方法,我们可以在Activity中通过Fragment实例调用这些方法,从而实现某些功能。接下来,我将介绍一些调用Fragment方法的常用方法: 1.使用回调方法 在Fragment中定义一个接口Callback,Activity实现该接口,Fragment通过该接口回调Activity中的方法,实现与Activity的交互。在Fragment中调用方法时,首先需要判断Activity是否实现了该接口,然后调用 Callback 中的方法。 2.使用FragmentManager 在Activity中使用FragmentManager的findFragmentById()方法或findFragmentByTag()方法获取到Fragment实例,然后使用该实例调用Fragment中的方法。 3.使用Bundle传递参数 在Activity中创建Bundle对象,将需要传递的参数放入Bundle中,然后通过调用Fragment的setArguments()方法将Bundle传递给Fragment。在Fragment中可以使用getArguments()获取传递的参数,实现功能。 以上就是调用Fragment方法的一些方法,开发者可以根据具体场景选择适当的调用方式。需要注意的是,在Activity中调用Fragment方法时,需要保证Fragment已经与Activity关联,否则会抛出异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值