getIntent().getExtras()在OnActivityResult中传递null值

8

我正在将一个来自Activity-A的上下文传递给一个页面适配器,在适配器内部,我正在传递一个意图来进行通话

 Intent intent = new Intent(Intent.ACTION_CALL);
                        intent.setData(Uri.parse("tel:" + number));
                        intent.putExtra("id",listId.toString());
                        context.startActivityForResult(intent, 105);

Activity A从另一个Activity B继承而来,在基础的Activity B内部,定义了onActivityResult:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);

    if (requestCode == 104) {
        if (GetLocation.isLocationEnabled(this)) {
            <my codes>
        }
    }
}

在 Activity A 中,我有一个 onActivityResult 方法:

@Override
 public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);

    if (requestCode == 105) {

        Bundle extras=getIntent().getExtras();
        String user_Id=extras.getString("id");         
    }
}

我总是得到一个空值的user_Id,有人能帮我解决这个问题吗?


https://dev59.com/Gm855IYBdhLWcg3woV4_ - IntelliJ Amiya
4个回答

8

请使用 intent.getExtras() 替代 getIntent().getExtras()

getIntent() 将会获取最初启动您的活动的 intent


这是我遇到的错误:java.lang.RuntimeException: 在将结果ResultInfo{who=null, request=105, result=0, data=null}传递给activity {mypackage.activities.myActivity}时发生失败: java.lang.NullPointerException at android.app.ActivityThread.deliverResults(ActivityThread.java:3354) at android.app.ActivityThread.handleSendResult(ActivityThread.java:3397) at 其他内容...这是因为参数意图(intent)为空吗?但它仍然无法工作。 - Hari Krishnan
你已经更新了你的问题,包括你正在打开结果和完整日志的活动代码。 - Rahul Tiwari

1
使用startActivityForResult()是为了当您想要一个Activity启动另一个Activity,但是希望第二个Activity在完成后向第一个Activity返回某种结果时。因此,一个例子是Activity A启动Activity B,然后当Activity B完成时,它会向Activity A发送响应。因此,您需要执行一些步骤才能实现这一点。
首先,您需要启动第二个Activity...
Intent intent = new Intent(this, YourSecondActivity.class);
Bundle bundle = new Bundle();
bundle.putString("yourStringExtra", theStringExtra);
intent.putExtras(bundle);
startActivityForResult(intent, 1);

当您准备完成第二个活动时,您需要设置结果以发送回第一个活动。您可以像这样操作...

Intent intent = new Intent();
intent.putExtra("string_result_from_second_activity", stringResult);
setResult(RESULT_OK, intent);
finish();

然后,当第二个Activity结束后,第一个Activity会重新启动,您可以通过重写onActivityResult()来拦截第二个Activity的结果,如下所示...
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == 1) {
           if(resultCode == RESULT_OK) {
                String resultString = data.getStringExtra("string_result_from_second_activity");
           }
        }
}

在这个例子中,第二个Activity在完成时会将字符串stringResult连同RESULT_OK resultCode一起发送回第一个Activity。因此,您需要检查requestCode(我们在第一个Activity中调用startActivityForResult()时设置为“1”),然后确保resultCode为RESULT_OK,然后才能访问Intent中的字符串extra。
希望这能澄清问题!

我在适配器中传递了一个意图来拨打电话。通话结束后,它会返回到同一活动。那么它是如何工作的? - Hari Krishnan
请查看我上面的代码。如果您正在传递“id”参数进行调用,它不会神奇地在您的“onActivityResult()”中返回。当完成活动并返回原始活动时,您必须显式地使用“setResult()”设置结果。 - NoChinDeluxe

0

我可能错了,但是不要使用getIntent()。我相信你只需要在方法签名中使用传递给onActivityResult的intent即可。


这是我遇到的错误:java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=105, result=0, data=null} to activity {mypackage.activities.myActivity}: java.lang.NullPointerException at android.app.ActivityThread.deliverResults(ActivityThread.java:3354) at android.app.ActivityThread.handleSendResult(ActivityThread.java:3397)等等...这是因为参数intent为空吗?但仍然无法解决。 - Hari Krishnan

0

我猜你的问题不是getIntent而是intent。我可能误解了你的问题,但我认为你对整个onActivityResult的理解有误。

只有在你之前使用startActivityForResult启动的活动完成后,才会调用onActivityResult。然后,您需要检查返回的resultCode是否等于RESULT_OK,并且requestCode是否与您启动该活动时使用的requestCode匹配。

要在完成之前设置结果,您需要执行以下操作:

Intent intent = getIntent();
intent.putExtra("id",listId.toString()); //Your ID comes here
setResult(RESULT_OK, intent);
finish();

编辑

根据评论中的阅读,您想要从PageAdapter通知底层Activity。因此,您需要在您的Activity中声明一个接口。

public interface IdListener{
    void onIdSelected(int id);
}

将此接口的新实例传递给您的活动。 可能在PageAdapter的构造函数中(创建自定义PageAdapter)。 在启动Intent之前,调用接口方法。

idListener.onIdSelected(yourID);
context.startActivity(intent); //don't call startActivityForResult(), you dont need it

我还是不完全明白你想要实现什么。但也许这比之前尝试的更符合你的需求。


我正在一个PageAdapter中进行操作,在该适配器中,我有一个名为context的Activity变量,正如我在问题中所提到的。所以你是要我像这样使用代码吗: context.setResult(106, intent); context.finish(); 但我不想在PageAdapter中结束我的Activity。你能否请更明确地说明一下? - Hari Krishnan
据我所知,使用onActivityResult无法实现您想要的功能。如果我理解您的想法正确,那么您需要一个回调到您的活动中。我会更新我的答案。 - AlbAtNf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接