web-dev-qa-db-ja.com

フラグメントはすでにアクティブです-setArgumentsを試行する場合

私は以下のリンクで与える例を使用しています

http://Android-er.blogspot.in/2013/04/handle-onlistitemclick-of-listfragment.html

ここでは、2つのクラスがあります。1つはリストフラグメントを拡張し、もう1つはフラグメントを拡張します。今、私はこの方法でオブジェクトをdetailfragmentに渡します:

*ListFragmentから*

@Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID);

        Bundle bundle = new Bundle();
        bundle.putSerializable(BUNDLE_KEY, obj);// passing this object

        detailFragment.setArguments(bundle);
        detailFragment.setUpLayout();// update the UI
} 

今、私が受け取ったFragmentクラスでは、基本的な目標は、リストフラグメントで選択されたアイテムに基づいてフラグメントのUIを更新することです。それが理由です。オブジェクトを送信しています

Bundle b = getArguments();
b.getSerializable(BUNDLE_KEY);

選択したアイテムに「フラグメントはすでにアクティブです」と表示されます。

ここでの問題は何ですか?私は何が間違っているのですか?

15
Goofy

別の解決策は、フラグメントの空のコンストラクターを作成することです。

public Detailfragment() {
    super();
    // Just to be an empty Bundle. You can use this later with getArguments().set...
    setArguments(new Bundle());
}

onListItemClickメソッドでは、そのバンドルを使用します。

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID);

    // Update the keys.
    detailFragment.getArguments().putSerializable(BUNDLE_KEY, obj);// passing this object

    detailFragment.setUpLayout();// update the UI
} 

これで、setUpLayout()メソッドでgetArguments()メソッドを呼び出すことができます。

18
Blehi

すでに引数があるかどうかを確認できます。ある場合は、引数を追加/更新するだけです。

private static void initFrag(Fragment frag, Bundle args) {
    if (frag.getArguments() == null) {
        frag.setArguments(args);
    } else {
        //Consider explicitly clearing arguments here
        frag.getArguments().putAll(args);
    }
}

オプションで、既存の引数がまだ有効であると安全に想定できない場合は、既存の引数を削除することをお勧めします。

12
Squimon

公式からAndroid開発リファレンス:

public void setArguments(Bundle args)このフラグメントの構築引数を指定します。これは、フラグメントがそのアクティビティにアタッチされる前にのみ呼び出すことができます。つまり、フラグメントを作成した直後に呼び出す必要があります。ここで提供される引数は、フラグメントの破棄と作成の間保持されます。

フラグメントはすでにそのアクティビティに添付されています独自のメソッドを使用することをお勧めします。setArgumentsは必要ありません!

フラグメントクラス内に独自のsetUIArguments(Bundle args)を作成し、このメソッド内でフラグメントUIを更新します

このメソッドを次のように呼び出します。

@Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID);

        Bundle bundle = new Bundle();
        bundle.putSerializable(BUNDLE_KEY, obj);// passing this object

        detailFragment.setUIArguments(bundle); /* your new method */
} 

フラグメントクラス内

public void setUIArguments(Bundle args) {
    getActivity().runOnUiThread(new Runnable() {
        public void run() {
            /* do your UI stuffs */
        }
    }
}
12
Tommaso Resti

ダイアログフラグメントのパブリックメソッド

   public void setBundle(final Bundle bundle) {
        final Bundle arguments = getArguments();
        arguments.clear();
        arguments.putAll(bundle);
   }

ダイアログフラグメントを表示または更新する

   public void showMessageDialogue(final String tag, final Bundle bundle) {
        final Fragment fragment = mFragmentManager.findFragmentByTag(tag);
        if (fragment != null && fragment instanceof MessageDialogueFragment) {
            ((MessageDialogueFragment) fragment).setBundle(bundle);
         } else {
            final MessageDialogueFragment messageDialogueFragment = new MessageDialogueFragment();
            messageDialogueFragment.setArguments(bundle);
            messageDialogueFragment.show(mFragmentManager, tag);
         } 
   }
0
Dmitry

この1つのグローバル変数:

private FragmentManager fragmentmanager;
private FragmentTransaction fragmenttransaction;

これらのコードは、「リストフラグメント」onCreate()アクティビティに配置されます。

fragmenttransaction = fragmentmanager.beginTransaction();
fragmenttransaction.replace(detailFragmentID, detailFragment, "test");
fragmenttransaction.addToBackStack(null);
fragmenttransaction.commit();

これらはDrawerlistitemクリックイベントです:

@Override
    public void onListItemClick(ListView l, View v, int position, long id) {

    Bundle bundle = new Bundle();
    fragmenttransaction = fragmentmanager.beginTransaction();

        if(fragmentmanager.findFragmentById("test") != null) {
            fragmenttransaction.remove(fragmentmanager.findFragmentByTag("test"));
        }     

   Detailfragment detailFragment =  (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID);

       bundle.putSerializable(BUNDLE_KEY, obj);// passing this object

       detailFragment.setArguments(bundle);
       fragmenttransaction.replace(detailFragmentID, detailFragment, "test");
       fragmenttransaction.addToBackStack(null);
       fragmenttransaction.commit();    
} 

フラグメントコードをそのまま拡張します。

Bundle b = getArguments();
b.getSerializable(BUNDLE_KEY);
0
Dhruv Raval