1

いくつかのデータをfragmentAからアクティビティを介して渡して、fragmentBでアクションを開始しようとしています。動作する方法は、ユーザーがアイテムia listview(listFragment)を押すと、アイテムデータが別のフラグメント(すでに表示されて実行されている)に送信され、fragmentAのデータを使用して新しいイベント/アクションを開始します。

FragmentA:

@Override
public void onListItemClick(ListView listView, View view, int position,
        long longId) {
    super.onListItemClick(listView, view, position, longId);

    String trackId = SD_PATH + songs.get(position);
    mCallbacks.onTrackSelected(trackId);

活動を通じて:

@Override
public void onTrackSelected(String trackId) {

            // This starts onTrackSelected() method in fragmentB
    topBarFragment topBarFragment = (topBarFragment)getSupportFragmentManager().findFragmentById(R.id.topBar_fragment);
    topBarFragment.onTrackSelected();

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

}

FragmentBのデータを取得します(これがクラッシュする場所です):

public void onTrackSelected() {

    // crashes on this line
    String trackId = getArguments().getString("trackId");
    Toast.makeText(getActivity().getApplicationContext(), trackId,Toast.LENGTH_SHORT).show();

}

チェックしたところ、データはからfragmentAに正常に渡されますがactivity、受信しようとするとクラッシュしますfragmentB

何をすべきか?

(fragmentBの親のアクティビティはfragmentAのアクティビティと同じではありません。これはそれと関係がありますか?)

logcat:

02-24 23:28:47.757: E/AndroidRuntime(14047): FATAL EXCEPTION: main
02-24 23:28:47.757: E/AndroidRuntime(14047): java.lang.NullPointerException
02-24 23:28:47.757: E/AndroidRuntime(14047):    at com.harteg.fragmentstest.topBarFragment.onTrackSelected(topBarFragment.java:47)
02-24 23:28:47.757: E/AndroidRuntime(14047):    at com.harteg.fragmentstest.ItemListActivity.onTrackSelected(ItemListActivity.java:83)
02-24 23:28:47.757: E/AndroidRuntime(14047):    at com.harteg.fragmentstest.TracksFragment.onListItemClick(TracksFragment.java:136)
02-24 23:28:47.757: E/AndroidRuntime(14047):    at android.support.v4.app.ListFragment$2.onItemClick(ListFragment.java:58)
02-24 23:28:47.757: E/AndroidRuntime(14047):    at android.widget.AdapterView.performItemClick(AdapterView.java:298)
02-24 23:28:47.757: E/AndroidRuntime(14047):    at android.widget.AbsListView.performItemClick(AbsListView.java:1100)
02-24 23:28:47.757: E/AndroidRuntime(14047):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:2749)
02-24 23:28:47.757: E/AndroidRuntime(14047):    at android.widget.AbsListView$1.run(AbsListView.java:3423)
02-24 23:28:47.757: E/AndroidRuntime(14047):    at android.os.Handler.handleCallback(Handler.java:725)
02-24 23:28:47.757: E/AndroidRuntime(14047):    at android.os.Handler.dispatchMessage(Handler.java:92)
02-24 23:28:47.757: E/AndroidRuntime(14047):    at android.os.Looper.loop(Looper.java:137)
02-24 23:28:47.757: E/AndroidRuntime(14047):    at android.app.ActivityThread.main(ActivityThread.java:5039)
02-24 23:28:47.757: E/AndroidRuntime(14047):    at java.lang.reflect.Method.invokeNative(Native Method)
02-24 23:28:47.757: E/AndroidRuntime(14047):    at java.lang.reflect.Method.invoke(Method.java:511)
02-24 23:28:47.757: E/AndroidRuntime(14047):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
02-24 23:28:47.757: E/AndroidRuntime(14047):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
02-24 23:28:47.757: E/AndroidRuntime(14047):    at dalvik.system.NativeStart.main(Native Method)

アップデート:

このようにコードを更新したところ、getArguments()がnullを返すことがわかりました。それはなぜですか。

    Bundle arguments = getArguments();
    if (arguments != null)
    {
        String trackId = getArguments().getString("trackId");
        Toast.makeText(getActivity().getApplicationContext(), trackId,Toast.LENGTH_SHORT).show();

    } else {
        Toast.makeText(getActivity().getApplicationContext(), "arguments returns null", Toast.LENGTH_SHORT).show();
    }

アップデート

このようなアクティビティでonTrackSelected()を更新しましたが、クラッシュしてフラグメントがすでにアクティブになっていると表示されます。これをどのように修正しますか?

@Override
public void onTrackSelected(String trackId) {
    // TODO Auto-generated method stub

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

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

        topBarFragment.onTrackSelected();

    }
4

1 に答える 1

1

アクティビティのonTrackSelected()メソッドでは、topBarFragment2回使用します。最初のものはおそらくあなたのレイアウトファイル(または前のトランザクション)からのものです。とにかく、この最初のフラグメントにはまだ引数がありませんが、onTrackSelected()とにかく呼び出します。最後に電話をかける必要があります。

また、メソッドの最後でも、なぜそれを新しく作成したのかを確認してください(この問題とは関係ありませんが、おそらく不要です)。

于 2013-02-25T11:46:06.753 に答える