流程是这样的:
调用B(通过startActivityForResult
)加载一组图像。在用户选择一个或多个图像之后,B调用C,其中用户可以进一步对图像进行排序。完成此步骤后,C调用A调用setResult(someResult, someIntent)
。
A中发生的是我收到了正确的请求代码,结果代码,但null
意图。
A期望从它首先调用的类中获得intent
吗?
我认为确实如此,我将此意图从B传递给C,但在C中我不得不处理该意图,因为B必须将自己的意图传递给A。
答案 0 :(得分:5)
这正是Intent.FLAG_ACTIVITY_FORWARD_RESULT
的用途: - )
A应该使用startActivityForResult()
启动B.将使用结果调用A onActivityResult()
。
B应使用以下内容启动C:
Intent intent = new Intent(this, C.class);
intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
intent.putExtra("...", ...); // If you need to pass additional data to C
startActivity(intent);
finish();
请注意,B使用startActivity()
代替startActivityForResult()
启动C.但是,因为您指定了Intent.FLAG_ACTIVITY_FORWARD_RESULT
,所以C现在可以将结果返回给A(最初启动B的活动)。
在C语言中,您只需拨打setResult()
和finish()
即可将结果返回给A.
答案 1 :(得分:3)
您不应该从A
拨打C
,而是在setResult()
中呼叫C
,然后在finish()
C
呼叫,在{ {1}}然后立即B
finish()
(来自B
),并在onActivityResult()
(A
)中获得最终结果。
流程将是:
onActivityResult()
答案 2 :(得分:2)
那么你可以调用onActivityResult两次从活动C转到活动A,让我用一个简单的例子进一步解释......
在A中你使用activityforResult调用b ...如果onResult带有正确的结果代码,那么它在C之后从B返回然后获取数据并做一些事情...... 活动A:
public class ActivityA extends Activity{
public static int A_REQUEST_CODE = 13215564;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
Intent i = new Intent(this, ActivityB.class);
startActivityForResult(i, A_REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == ActivityB.B_RESULT_CODE){
//get the data an work on it
data.getExtras().getString("CHANGE"); // Changed image
}
}
}
然后在B中,你在选择图像后用ActivityforResult调用C,检查是否有任何结果来自C(意味着将从C返回),如果那样的情况则返回A并传递意图
活动B:
public class ActivityB extends Activity {
public static int B_REQUEST_CODE = 64684687;
public static int B_RESULT_CODE = 64004684;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent i = new Intent(this,ActivityC.class);
Bundle info = new Bundle();
info.putString("IMAGE", "IMAGE_PATH");
startActivityForResult(i,B_REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == B_REQUEST_CODE && resultCode == ActivityC.C_RESULT_CODE){
setResult(B_RESULT_CODE,data);
finish();
}
}
}
在C中只需处理数据并使用正确的结果集返回c
活动C:
public class ActivityC extends Activity {
public static int C_RESULT_CODE = 654846622;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String imageString = getIntent().getExtras().getString("IMAGE");
//Work on the image then
Intent i = new Intent();
Bundle b = new Bundle();
b.putString("CHANGE", "the changed image");
i.putExtras(b);
setResult(C_RESULT_CODE, i);
finish();
}
}
希望它有助于好运:))
答案 3 :(得分:0)
要么将您的架构更改为片段......并在主机活动中处理此数据,
或
不要B
只使用startActivityForResult
并浏览活动,当图片已经排序或C活动中的任何内容时,再次startActivity
将您的数据作为Extra意图,现在回到活动A,在onCreate方法中,检查startActivity(A)
和getIntent
方法,如果有,意味着你要发回数据,所以做你想做的任何事情。 hasExtra
,
再次,碎片方法更好,当然
编辑: 刚刚看到@ shkschneider的答案,如果你坚持使用活动,那似乎是合法的