在Android Transfuse中,如何使用startActivityForResult和onActivityResult将意图传递回

在Android Transfuse中,如何使用startActivityForResult和onActivityResult将意图传递回,android,annotations,transfuse,Android,Annotations,Transfuse,我在玩Android的Transfuse框架时玩得很开心,但我不知道一个活动如何通过Intent返回值 通常,在Android应用程序中,您会调用startActivityForResult来启动活动,然后当启动的活动完成并向您提供包含返回数据的意图时,onActivityResult将被回调。我不知道Transfuse如何在不完全脱离框架的情况下处理这个问题,并且一路走下去。在ActivityResult上没有的事件注释,IntentFactory似乎无法使用startActivityForR

我在玩Android的Transfuse框架时玩得很开心,但我不知道一个活动如何通过Intent返回值

通常,在Android应用程序中,您会调用
startActivityForResult
来启动
活动
,然后当启动的活动完成并向您提供包含返回数据的
意图时,
onActivityResult
将被回调。我不知道Transfuse如何在不完全脱离框架的情况下处理这个问题,并且一路走下去。在ActivityResult上没有
的事件注释
IntentFactory
似乎无法使用
startActivityForResult
启动
活动
,到目前为止,这对我来说是一个交易破坏者

在这个主题上,我想提出的另一个相关问题是,在Android中,您可以使用以下代码将活动堆栈倒带到目标活动

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
,从而将
Intent
传递给它。我不明白输血是怎么做到的
IntentFactory
几乎实现了这一点,只是它无法将标志设置为
Intent
,并且
onNewIntent
没有事件注释。我还想验证一下,假设我有以下内容

@Inject @Extra("key") String key;
调用
onNewIntent
时是否会更新它


提前谢谢。我要特别感谢约翰卡尔的出色工作。我玩得很开心。

谢谢你对输血的赞誉和好话

看起来Transfuse中缺少了
@OnActivityResult
事件映射,但添加()。您必须使用当前的0.2.3-snapshot才能使用此功能,该功能应在maven central上可用,直到发布非快照

Transfuse不会通过注入的额外功能来处理活动结果,目前看来,您需要以常规的Android方式来处理。好消息是,输血可以帮助地图中的按钮点击和意图建设。下面是一个例子:

在第一个活动中触发意图的按钮侦听器:

@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);
    }
};
@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();
    }
};
@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();
        }
    }
}
按钮侦听器返回第二个活动的结果:

@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);
    }
};
@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();
    }
};
@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();
        }
    }
}
然后,原始活动中的OnActivityResult方法:

@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);
    }
};
@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();
    }
};
@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();
        }
    }
}
不要忘记,您可以注入当前活动、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事件也丢失了。我将很快将其与最近添加的任何其他事件一起添加。

要处理结果,您还可以执行以下操作:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == YOUR_REQUEST_CODE_TO_CHECK) {
        if (resultCode == RESULT_OK) {
            // Do something.
        }
    }
}
玩得开心