在Android Transfuse中,如何使用startActivityForResult和onActivityResult传递Intent

时间:2013-07-20 15:44:42

标签: android annotations transfuse

我在使用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); ,这将传递给onNewIntentJavadoc我不知道Transfuse如何做到这一点。 Intent几乎得到了这个,除了它无法设置IntentFactory的标记,并且Intent没有事件注释。我还想验证一下,让我说我有以下内容。

onNewIntent

调用@Inject @Extra("key") String key; 时会更新吗?

提前致谢。我要特别感谢johncarl的出色工作。我玩得很开心。

2 个答案:

答案 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.
        }
    }
}

玩得开心