相关疑难解决方法(0)

片段已添加IllegalStateException

我在容器Activity上使用此方法来显示BFrag

public void showBFrag()
{
    // Start a new FragmentTransaction
    FragmentTransaction fragmentTransaction = mFragmentMgr.beginTransaction();

    if(mBFrag.isAdded())
    {
        Log.d(LOG_TAG, "Show() BFrag");
        fragmentTransaction.show(mBFrag);   
    }
    else
    {
        Log.d(LOG_TAG, "Replacing AFrag -> BFrag");
        fragmentTransaction.replace(R.id.operation_fragments_frame, mBFrag);
    }

    // Keep the transaction in the back stack so it will be reversed when backbutton is pressed
    fragmentTransaction.addToBackStack(null);

    // Commit transaction
    fragmentTransaction.commit();        
}
Run Code Online (Sandbox Code Playgroud)

我从容器Activity中调用它; 首次:

  • 进入else语句,mBFrag替换为mAFrag.

然后我按下后退按钮:

  • 并且操作被反转(显示了mAFrag,但是..删除了mBFrag?).

然后我通过从同一个Activity调用showBFrag()再次前进:

  • 并且它获得了进入else语句的AGAIN.(所以我可以推断mBFrag没有添加)
  • 但我得到一个Fragment已经添加了IllegalStateException ...(那么为什么它没有进入if语句呢?)

所以:

  1. 为什么如果我已经添加了一个Fragment IllegalStateException,则isAdded()方法不会返回TRUE ?
  2. popBackStack操作是否完全删除以前添加的片段?
  3. 我误解了什么行为?

编辑:这是异常的完整信息.

06-07 12:08:32.730: ERROR/AndroidRuntime(8576): java.lang.IllegalStateException: Fragment …
Run Code Online (Sandbox Code Playgroud)

android fragment illegalstateexception android-fragments android-3.0-honeycomb

55
推荐指数
3
解决办法
8万
查看次数

如何清除Fragment中的参数?

我有一个AudioPlayerFragment用setArguments()传递一些url的东西.

如果我的实例中有一个url密钥,我会启动一个播放音频流的服务.如果已经播放了一个流,我会停止它并使用新流再次启动它.getArguments()AudioPlayerFragment

如果没有争论,我什么都不做.

我的问题是参数与实例保持一致,所以当我回到它时getArguments(),如果没有设置新的,则返回最新的参数集.

所以在阅读它们之后,我尝试将参数设置为null

setArguments(null);
Run Code Online (Sandbox Code Playgroud)

但我明白了

Java.lang.IllegalStateException: fragment already active
Run Code Online (Sandbox Code Playgroud)

那我怎么能清除这些论点呢?

android fragment

8
推荐指数
3
解决办法
8153
查看次数

将数据传递给添加的片段 - IlligalStateException:片段已处于活动状态

我有两个活跃的片段并在平板电脑上并排显示.当用户从fragmentA中的listview中选择一个项目时,我需要将一些数据从fragmentA传递给fragmentB.尝试将活动中的数据传递到fragmentB时出现问题.我收到错误:IlligalStateException:片段已经激活.

我从这样的活动传递数据:

    @Override
    public void onTrackSelected(String trackId) {

        topBarFragment topBarFragment = (topBarFragment)getSupportFragmentManager().findFragmentById(R.id.topBar_fragment);

        Bundle bundle = new Bundle();
        bundle.putString("trackId", trackId);
        //set Fragmentclass Arguments
        topBarFragment.setArguments(bundle);

        topBarFragment.onTrackSelected();

    }
Run Code Online (Sandbox Code Playgroud)

然后在fragmentB中接收如下:

public void onTrackSelected() {

        String trackId = getArguments().getString("trackId");
        Toast.makeText(getActivity().getApplicationContext(), trackId,Toast.LENGTH_SHORT).show();

    }   
}
Run Code Online (Sandbox Code Playgroud)

logcat的:

02-25 02:58:22.190: E/AndroidRuntime(29593): FATAL EXCEPTION: main
02-25 02:58:22.190: E/AndroidRuntime(29593): java.lang.IllegalStateException: Fragment already active
02-25 02:58:22.190: E/AndroidRuntime(29593):    at android.support.v4.app.Fragment.setArguments(Fragment.java:500)
02-25 02:58:22.190: E/AndroidRuntime(29593):    at com.harteg.fragmentstest.ItemListActivity.onTrackSelected(ItemListActivity.java:88)
02-25 02:58:22.190: E/AndroidRuntime(29593):    at com.harteg.fragmentstest.TracksFragment.onListItemClick(TracksFragment.java:136)
02-25 02:58:22.190: E/AndroidRuntime(29593):    at android.support.v4.app.ListFragment$2.onItemClick(ListFragment.java:58)
02-25 02:58:22.190: E/AndroidRuntime(29593):    at android.widget.AdapterView.performItemClick(AdapterView.java:298)
02-25 02:58:22.190: E/AndroidRuntime(29593): …
Run Code Online (Sandbox Code Playgroud)

java android android-fragments

5
推荐指数
1
解决办法
7920
查看次数