如何使用StartActivityForResult()

时间:2016-06-11 21:18:25

标签: android android-fragments

在我的应用中,我需要向用户询问快速 input

我需要从 Flash-Activity 获得结果,然后返回上一个。

我已经阅读了StartActivityForResult()方法,但我还不确定如何正确使用它,任何示例?

修改

我尝试使用我在应用于StartActivityForResult()方法的所有app中使用的方法,通过intent(作为结果)传递Player对象:

在我的第二个Activity中(我需要从中获取结果):

Intent intent = new Intent();
Player playerKilled = players.get(position);

Bundle bundle = new Bundle();
bundle.putSerializable("PLAYER_KILLED", (Serializable) playerKilled);
intent.putExtras(bundle);

setResult(Activity.RESULT_OK, intent);
finish();

我的主要活动,我需要将结果带到:

if (resultCode == Activity.RESULT_OK) {

    Intent intent = this.getIntent();
    Bundle bundle = intent.getExtras();
    playerKilled = (Player)bundle.getSerializable("PLAYER_KILLED");

    Toast.makeText(this, playerKilled.getName() + "the " + playerKilled.getCardName() + " has died, and he/she had the ID: " + playerKilled.getId(), Toast.LENGTH_SHORT).show();

3 个答案:

答案 0 :(得分:15)

您可以通过多种方式请求用户输入,但如果您想使用新的Activity,如上所述,我们可以使用startActivityForResult()启动新活动并返回那里。

首先,我强烈建议您阅读this Stack Overflow answer,了解如何使用startActivityForResult()。我将解释如何为特定用例实现它。

因此,您需要了解startActivityForResult()有两个参数:

  • Intent(用于在活动之间传递数据)
  • 标识您的请求的“请求代码”整数

最好为您的请求代码使用常量,您可以在两个活动中访问该代码。例如,在您的主要活动中,您可以添加:

public static final int REQUEST_CODE = 1;

这两个活动都可以访问,因为它是public,它可以用于请求代码,因为它是int(整数)。

在您的主要活动中,您需要一个动作(例如按下按钮)才能开始您的第二项活动。我们假设它是一个触发此操作的按钮单击:

Button button = (Button) findViewById(R.id.your_button);
button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        // actions that will happen when the button is pressed:

        Intent intent = new Intent(this, SecondActivity.class);
        startActivityForResult(intent, REQUEST_CODE);
    }
});

基本上,我们正在创建一个Intent来指定我们当前的活动(this)和第二个活动。我们使用startActivityForResult()方法中的intent以及我们之前声明的REQUEST_CODE

现在,在我们的第二个活动中,我们需要一些东西来触发返回的数据。从the previous question you asked开始,我假设您希望在单击RecyclerView项目时将数据返回到主活动。以下part of my answer to that question已修改,以显示如何将数据发回。

ExampleClickAdapter clickAdapter = new ExampleClickAdapter(yourObjects);
clickAdapter.setOnEntryClickListener(new ExampleClickAdapter.OnEntryClickListener() {
    @Override
    public void onEntryClick(View view, int position) {
        Intent intent = new Intent();
        intent.putExtra("pos", position);
        setResult(Activity.RESULT_OK, intent);
        finish();
    }
});
recyclerView.setAdapter(clickAdapter);

以上内容将从RecyclerView点击后发回列表项的位置。

查看Intent的{​​{1}}方法。这是传递数据的原因。您可以看到我在此方法中传递了字符串putExtra()和项"pos"的变量,但原因是:

position

intent.putExtra("key", object); 的{​​{1}}方法始终使用String键和另一个对象,例如整数变量putExtra。检索此对象时将再次使用该键(我将在稍后向您展示)。

我们使用Intent表示我们正在传递结果,但如果您不想发回结果,则可以使用position - 我在上面提到的答案链接中对此进行了解释一开始。请注意,如果您使用Activity.RESULT_OK,则无需使用Activity.RESULT_CANCELED,因为无法发回任何内容。

最后,您需要在主要活动中添加一些内容,以处理从第二个活动中收到的结果:

Activity.RESULT_CANCELED

我们使用putExtra方法。

在此方法的开头,我们正在检查@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE) { if (resultCode == Activity.RESULT_OK) { int result = data.getIntExtra("pos"); // do something with the result } else if (resultCode == Activity.RESULT_CANCELED) { // some stuff that will happen if there's no result } } } 是否与我们之前定义的相同(作为公共常量,onActivityResult)。

如果是,我们继续并检查结果的requestCode是什么。如果数据已发回(REQUEST_CODE),我们可以使用resultCode检索它,因为Activity.RESULT_OK是一个整数(类似地,如果要返回String,请使用getIntExtra())。然后,您可以对返回的数据执行某些操作。但是,如果没有发回数据(正如我们之前提到的position),您可以做其他事情。

希望这可以帮助您实现您的想法,但Google搜索会找到我上面提到的答案(here is the link again),该答案清楚地解释了如何使用getStringExtra()。这个问题的其他答案也很好地解释了,但是你可能需要指导如何在你的用例中实现它(即结合你之前提出的问题中的代码),这就是我提供上述解释的原因。 / p>

您还可以阅读Android documentation on Getting a Result from an Activity以及[Activity.RESULT_CANCELED方法](https://developer.android.com/reference/android/app/Activity.html#startActivityForResult(android.content.Intent,int))和Intents的Android文档。

答案 1 :(得分:1)

如果我理解你的问题,我相信你想要这个解决方案:

startActivityForResult(intent, REQUEST_CODE);

只需使用项目列表(recyclerview?)创建您的活动然后启动它以获得结果,您基本上创建您的意图并调用上述方法。

Intent intent = new Intent(this, SecondActivity.class);
startActivityForResult(intent, SOME_UNIQUE_CODE);

现在,在您进入列表活动后,只需在用户选择项目时执行以下操作:

intent = new Intent();
intent.putExtra("id", "Some Value Here to return");
setResult(RESULT_OK, intent);
finish();

因此,当用户立即点击列表中的某个项目时,您可以使用此代码传回您的值并关闭此列表活动。

最后,要实际接收此值,您只需覆盖onActivityResult()

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
    if (requestCode == REQUEST_CODE){
        if (resultCode == RESULT_OK){

            id = data.getExtras().getString("id");
        }
    }
}

这就是你所需要的!我会说创建一个活动是完全正常的,即使它只做一件事 - 显示一个项目列表!我希望这可以帮助你!祝你好运,编码愉快!

答案 2 :(得分:0)

您可以执行的操作是弹出一个看起来像对话框的活动。

在清单中,您声明活动的位置,包括一个对话框主题:

<activity
    android:name="com.myapp.DialogActivity"
    android:theme="@android:style/Theme.Holo.Light.Dialog"
    ...
</activity>

然后以正常的方式调用活动,结果如果您愿意:

Intent i = new Intent(this, DialogActivity.class);
startActivityForResult(i, REQUEST_CODE);