简体   繁体   English

将数据从活动传递到片段时,应用程序崩溃

[英]App crashes when passing data from activity to fragment

I'm trying to pass some data from fragmentA through an activity to start an action in fragmentB. 我试图通过一个活动传递来自fragmentA的一些数据,以在fragmentB中开始一个动作。 The way it should work is, user presses an item ia listview(listFragment), items data gets send to another fragment (which is visible and running already) to start a new event/action using the data from fragmentA. 它的工作方式是,用户在listview(listFragment)中按下一个项目,将项目数据发送到另一个片段(可见且已在运行),以使用来自fragmentA的数据开始新的事件/操作。

FragmentA: 片段A:

@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);

Through activity: 通过活动:

@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);

}

retrieve data in fragmentB (this is where is crashes): 检索fragmentB中的数据(这是崩溃的地方):

public void onTrackSelected() {

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

}

I've checked and the data gets passes fine from fragmentA to activity , but then it crashes when trying to receive it fragmentB . 我已经检查过,并且数据可以从fragmentA传递到activity ,但是在尝试接收fragmentB时它崩溃了。

What to do? 该怎么办?

(fragmentB's parrent activity is not the same as fragmentA's. Can this have something to do with it?) (fragmentB的当前活动与fragmentA的不同。这与它有关系吗?)

logcat: 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)

UPDATE: 更新:

I updated my code like this, and found out that getArguments() returns null.. Why is that? 我这样更新代码,发现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();
    }

UPDATE UPDATE

I updated the onTrackSelected() in the activity like this, but now it crashes and says that fragment is already active. 我在这样的活动中更新了onTrackSelected(),但现在它崩溃了,并说该片段已处于活动状态。 How do you fix this? 您如何解决这个问题?

@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();

    }

In your Activity's onTrackSelected() method you use topBarFragment twice. 在Activity的onTrackSelected()方法中,两次使用topBarFragment The first one probably from your layout file (or from a previous transaction). 第一个可能来自您的布局文件(或来自先前的事务)。 Anyway, this first fragment doesn't have the arguments yet, but you call onTrackSelected() anyway. 无论如何,第一个片段还没有参数,但是无论如何您onTrackSelected()调用onTrackSelected() You should put the call at the very end. 您应该将通话放在最后。

And check why you created it anew at the end of the method as well (not related to this problem, but probably unnecessary). 并检查为什么还要在方法末尾重新创建它(与该问题无关,但可能不必要)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM