通过意图传递数据不起作用

时间:2017-05-24 20:24:01

标签: android android-intent android-activity android-bundle

更新

最后,这是一个序列化问题,正如评论中指出的那样。

所以,我在适配器的ViewHolder内有这个方法:

@Override
public void onClick(View view) {
    int position = getAdapterPosition();
    if (position != RecyclerView.NO_POSITION) {
        Offer offer = offers.get(position);
        Intent intent = new Intent(context, MyOfferActivity.class);
        Bundle extras = new Bundle();
        extras.putSerializable(Constants.OFFER_INTENT_KEY, offer);
        extras.putSerializable(Constants.USER_INTENT_KEY, user);
        intent.putExtras(extras);
        context.startActivity(intent);
    }
}

onCreateView的{​​{1}}我执行此操作:

MyOfferActivity

问题是Bundle extras = getIntent().getExtras(); offer = (Offer) extras.getSerializable(Constants.OFFER_INTENT_KEY); user = (User) extras.getSerializable(Constants.USER_INTENT_KEY); 最终offer。我已经调试了它,当我把它放在bundle中时它不是null。我可以获得null就好了。

这是以前没有任何麻烦的工作,它“神奇地”停止了工作。

实际上,最初我是这样做的,因为它无处不在,我把它改成了前面的代码,看看是否修复了它。它没有。

user

在接收器上:

@Override
public void onClick(View view) {
    int position = getAdapterPosition();
    if (position != RecyclerView.NO_POSITION) {
        Offer offer = offers.get(position);
        Intent intent = new Intent(context, MyOfferActivity.class);
        intent.putExtra(Constants.USER_INTENT_KEY, user);
        intent.putExtra(Constants.OFFER_INTENT_KEY, offer);
        context.startActivity(intent);
    }
}

它能是什么?

我已经尝试了这两个版本的代码,并且还改变了我设置附加内容并接收它们的顺序,但它仍然不起作用。 此外,offer = (Offer) getIntent().getSerializableExtra(Constants.OFFER_INTENT_KEY); user = (User) getIntent().getSerializableExtra(Constants.USER_INTENT_KEY); 返回false。

这是错误:

getIntent().hasExtra(Constants.OFFER_INTENT_KEY)

导致它的一行是这样的: FATAL EXCEPTION: main Process: com.yournanny, PID: 742 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.yournanny/com.yournanny.activities.offers.MyOfferActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'com.yournanny.models.Nanny com.yournanny.models.Offer.getAcceptedNanny()' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2711) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2772) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1515) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:241) at android.app.ActivityThread.main(ActivityThread.java:6223) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'com.yournanny.models.Nanny com.yournanny.models.Offer.getAcceptedNanny()' on a null object reference at com.yournanny.activities.offers.MyOfferActivity.setContent(MyOfferActivity.java:69) at com.yournanny.activities.offers.MyOfferActivity.onCreate(MyOfferActivity.java:64) at android.app.Activity.performCreate(Activity.java:6705) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2664) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2772)  at android.app.ActivityThread.-wrap12(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1515)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:241)  at android.app.ActivityThread.main(ActivityThread.java:6223)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)  这是我在活动中使用if (user.getType() == UserType.FAMILY && offer.getAcceptedNanny() == null && offer.getState() == State.REQUESTED)的第一个。

2 个答案:

答案 0 :(得分:0)

你的第二个选择应该可以正常工作。

替换

extras.putSerializable(Constants.OFFER_INTENT_KEY, offer);
extras.putSerializable(Constants.USER_INTENT_KEY, user);

intent.putExtra(Constants.OFFER_INTENT_KEY, offer);
intent.putExtra(Constants.USER_INTENT_KEY, user);

以及您的活动

offer = (Offer) getIntent().getSerializableExtra(Constants.OFFER_INTENT_KEY);
user = (User) getIntent().getSerializableExtra(Constants.USER_INTENT_KEY);

答案 1 :(得分:-1)

你好@moondaisy,                 我建议你使用Parcelable接口传递数据。这是链接https://developer.android.com/reference/android/os/Parcelable.html 另请查看此How can I make my custom objects Parcelable?

Parcelable界面比Serilization更快,使您的应用程序高效。