58

フラグメントがあります。

MyFragment myFrag = new MyFragment();

このフラグメントにバンドル データを配置します。

Bundle bundle = new Bundle(); 
bundle.putString("TEST", "test");
myFrag.setArguments(bundle);

次に、古いフラグメントをこれに置き換えて、バックスタックに置きます。

//replace old fragment
fragmentTransaction.replace(R.id.fragment_placeholder, myFrag, "MyTag");
//put on backstack
fragmentTransaction.addToBackStack(null);
//commit & get transaction ID
int transId = fragmentTransaction.commit();

後で、上記のトランザクション ID( )を使用してバックスタックをポップします。transId

//pop the transaction from backstack
fragmentManager.popBackStack(transId,FragmentManager.POP_BACK_STACK_INCLUSIVE); 

後で、再度 fragment( )の引数としてバンドル データを設定します。myFrag

//Got Java.lang.IllegalStateException: fragment already active
myFrag.setArguments(bundle);

ご覧のとおり、上記のコードで例外が発生しJava.lang.IllegalStateException: fragment already activeました。バックスタックからトランザクションをポップしたのに、なぜまだアクティブなのかわかりません。 、とにかく、例外を受け取ったので、フラグメントを無効にするしかないと思ったので、次のようにしました。myFrag

Fragment activeFragment = fragMgr.findFragmentByTag("MyTag");
fragmentTransaction.remove(activeFragment);

フラグメントを非アクティブ化する方法が見つからなかったため、上記のコードが本当にフラグメントを非アクティブ化できるかどうかはわかりません。:(

その後、myFrag再度バンドル データをフラグメントに設定しようとすると、同じエラーが発生します。

Java.lang.IllegalStateException: fragment already active

フラグメントを削除しても、まだアクティブなようです...なぜですか? フラグメントを非アクティブ化するには?

4

8 に答える 8

152

setArguments(Bundle args)ソースを読むと、理解に役立ちます。

/**
* Supply the construction arguments for this fragment.  This can only
* be called before the fragment has been attached to its activity; that
* is, you should call it immediately after constructing the fragment.  The
* arguments supplied here will be retained across fragment destroy and
* creation.
*/
public void setArguments(Bundle args) {

    if (mIndex >= 0) {
        throw new IllegalStateException("Fragment already active");
    }
    mArguments = args;
}

同じFragmentのコードでsetArguments(Bundle args)を再度使用することはできません。あなたがやりたいことは、新しいフラグメントを作成して、引数を再度設定することです。または、getArguments()を使用してから、バンドルのメソッドを使用してその値を変更できます。 put

于 2013-02-26T08:41:42.263 に答える
1

新しいフラグメントを追加する前に、以前のフラグメントを削除してみてください: https://stackoverflow.com/a/6266144/969325

于 2012-04-28T15:05:36.607 に答える
1

remove() フラグメントのステータスを非アクティブに変更します。あなたの場合、remove(..) の後に commit() を呼び出さなかっただけです。

fragmentTransaction.remove(activeFragment);

remove() の後に commit() も行います。

fragmentTransaction.remove(activeFragment).commit();
于 2014-11-20T11:08:24.313 に答える
0

同じ問題がありました。フラグメントをバックスタックに追加していました。エラーは、popbackstack() を呼び出さなかったためです。popbackstack の使用が役に立ちました

于 2016-04-25T08:31:31.180 に答える
-1
  1. たとえば、レイアウトが現在のものか古いものかを確認します

    setContentView(R.layout.activity_main);
    
  2. プロジェクト ファイル内の古い .gradle ファイルを削除し、プロジェクトの gradle ファイルを再構築します。

于 2018-08-24T05:07:50.527 に答える