15

以下のリンクにある例を使用しています

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

ここでは、List Fragment を拡張するクラスと Fragment を拡張するクラスの 2 つのクラスがあります。今、私はこの方法で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);

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

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

4

5 に答える 5

12

公式の 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 */
        }
    }
}
于 2013-11-15T10:53:45.077 に答える
0

この 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);
于 2014-10-10T13:00:36.140 に答える