getIntent()。getExtras()在OnActivityResult中传递空值

时间:2015-10-08 13:21:55

标签: android

我正在将一个上下文从一个活动-A传递给一个页面适配器,并且在该适配器里面我正在传递一个打电话的意图

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

活动A继承自另一个活动B,在活动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>
        }
    }
}

内部活动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获取空值,任何人都可以帮我解决这个问题吗?

4 个答案:

答案 0 :(得分:6)

使用compile 'com.android.support:appcompat-v7:23.0.0' 代替intent.getExtras()

getIntent().getExtras()会为您提供最初启动您的活动的getIntent()

答案 1 :(得分:0)

我可能错了,而不是使用getIntent()。我相信你只想在方法签名中使用传递给onActivityResult的意图。

答案 2 :(得分: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通知底层活动。因此,您需要在活动中声明一个接口

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

将此界面的新实例传递给您的活动。也许在PageAdapter的构造函数中(创建一个自定义的)。在启动Intent之前,请调用interfaces方法。

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

我仍然没有完全得到你想要实现的目标。但也许这比你以前尝试过的更适合你的需求。

答案 3 :(得分:0)

startActivityForResult()的使用是为了让你想要一个Activity启动另一个Activity,但是当第二个Activity完成时让第二个Activity返回某个结果。因此,一个示例是活动A启动活动B,然后当活动B完成时,它会将响应发送回活动A.因此,您需要采取一些步骤来实现此目的。

首先,你需要开始你的第二个活动......

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 resultCode一起完成时,第二个Activity将字符串RESULT_OK发送回第一个Activity。所以你检查requestCode(当我们在第一个Activity中调用startActivityForResult()时我们将其设置为“1”),然后确保resultCode为RESULT_OK,然后我们继续并从中访问字符串extra意图。

希望这能澄清事情!