我在使用Android的Transfuse框架时玩得很开心,但我无法弄清楚Activity如何通过Intent返回值。
通常在Android应用中,您可以致电startActivityForResult
以启动Activity
,然后在已启动的活动完成后回拨onActivityResult
并为您提供{{1} },包含返回的数据。我没有看到Transfuse如何处理这个问题而没有完全打破框架并一直保留下去。 Intent
没有事件注释,而onActivityResult
似乎无法使用IntentFactory
启动Activity
到目前为止,这对我来说是一个交易破坏者。
在这个主题上,我想提出的另一个相关问题是,在Android中,您可以使用以下代码将活动堆栈倒回到目标活动。
startActivityForResult
然后目标Activity将被调用Intent i = new Intent(this, DestActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
i.putExtra("key", "val");
startActivity(i);
,这将传递给onNewIntent
。 Javadoc我不知道Transfuse如何做到这一点。 Intent
几乎得到了这个,除了它无法设置IntentFactory
的标记,并且Intent
没有事件注释。我还想验证一下,让我说我有以下内容。
onNewIntent
调用@Inject @Extra("key") String key;
时会更新吗?
提前致谢。我要特别感谢johncarl的出色工作。我玩得很开心。
答案 0 :(得分:3)
感谢Transfuse的赞誉和善意的话语。
看起来Transfuse中缺少@OnActivityResult
事件映射,但添加(https://github.com/johncarl81/transfuse/issues/47)很容易。您将不得不使用当前的0.2.3快照来使用此功能,该功能应该在maven central上可用,直到非SNAPSHOT被释放。
Transfuse不会通过注入的额外内容来处理Activity结果,而且暂时看起来你需要以常规的Android方式处理它。好消息是Transfuse可以帮助映射按钮点击和意图构建。这是一个例子:
按钮侦听器在第一个Activity中触发intent:
@RegisterListener(R.id.resultonebutton)
public android.view.View.OnClickListener listener = new android.view.View.OnClickListener() {
@Override
public void onClick(android.view.View view) {
android.content.Intent intent = intentFactory.buildIntent(new ResultTwoActivityStrategy());
context.startActivityForResult(intent, REQUEST);
}
};
Button侦听器返回第二个Activity的结果:
@RegisterListener(R.id.resulttwobutton)
public android.view.View.OnClickListener listener = new android.view.View.OnClickListener() {
@Override
public void onClick(android.view.View view) {
Intent returnIntent = new Intent();
returnIntent.putExtra(ResultOne.RESULT_KEY, inputText.getText().toString());
activity.setResult(android.app.Activity.RESULT_OK, returnIntent);
activity.finish();
}
};
然后是原始Activity中的OnActivityResult方法:
@OnActivityResult
public void result(int requestCode, int resultCode, android.content.Intent data) {
if (requestCode == REQUEST) {
if(resultCode == android.app.Activity.RESULT_OK){
String result=data.getStringExtra(RESULT_KEY);
Toast.makeText(context, result, SharedVariables.ONE_SECOND).show();
}
}
}
不要忘记您可以注入当前的Activity,IntentFactory和所有小部件。
要为intent添加标志,您只需构建intent并调用.addFlags()方法。如果您使用的是IntentFactory,它将如下所示:
Intent intent = intentFactory.buildIntent(new ResultTwoActivityStrategy());
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
context.startActivity(intent, REQUEST);
看起来onNewIntent事件也缺失了。我会尽快补充其他最近添加的活动。
答案 1 :(得分:0)
要处理结果,您也可以这样做:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == YOUR_REQUEST_CODE_TO_CHECK) {
if (resultCode == RESULT_OK) {
// Do something.
}
}
}
玩得开心