我正在将一个上下文从一个活动-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获取空值,任何人都可以帮我解决这个问题吗?
答案 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意图。
希望这能澄清事情!