如何使用 StartActivityForResult() [英] How to use StartActivityForResult()

查看:31
本文介绍了如何使用 StartActivityForResult()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的应用中,我需要询问用户一个quick input.

In my app I need to ask the user a quick input.

我需要得到这个结果 Flash-Activity 然后回到上一个.

我已经了解了 StartActivityForResult() 方法,但我还不确定如何正确使用它,有什么例子吗?

I've read about the StartActivityForResult() method, but I'm not yet sure how to use it properly, any examples?

我尝试使用我在所有应用程序中使用的方法通过意图(作为结果)传递播放器对象:

I've tried to pass the Player object via intent (as the result) using the method I used in all the app applied to this method of the StartActivityForResult():

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

In my second Activity (the one where I need to get the result from):

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();

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

My Main Activity where I need to take the result to:

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();

推荐答案

您可以通过多种方式请求用户输入,但是如果您想使用新的 Activity,正如您提到的,我们可以使用 startActivityForResult() 启动一个新活动并从那里返回输入.

You can request user input in a number of ways, but if you want to use a new Activity, as you mentioned, we can use startActivityForResult() to launch a new activity and return the input from there.

首先,我强烈建议阅读这个堆栈溢出答案,了解如何使用 startActivityForResult().我将解释如何针对您的特定用例实施它.

Firstly, I would highly recommend reading through this Stack Overflow answer about how to use startActivityForResult(). I will explain how you can implement it for your specific use case.

所以,你需要明白startActivityForResult()有两个参数:

So, you need to understand that startActivityForResult() has two parameters:

  • Intent(用于在活动之间传递数据)
  • 一个请求代码"整数,用于标识您的请求
  • the Intent (which you use to pass data between activities)
  • a "request code" integer that identifies your request

为您的请求代码使用常量是一种很好的做法,您可以在两个活动中访问该常量.例如,在您的主要活动中,您可以添加:

It is good practice to use a constant for your request code that you can access in both of your activities. For example, in your main activity, you could add:

public static final int REQUEST_CODE = 1;

这在两个活动中都可以访问,因为它是 public,并且它可以用于请求代码,因为它是一个 int(整数).

This would be accessible in both activities since it is public, and it would work for a request code since it is an int (integer).

在您的主要活动中,您需要一个操作(例如按下按钮)来开始您的第二个活动.让我们假设是一个按钮点击触发了这个动作:

In your main activity, you need an action (such as a button press) to start your second activity. Let's assume it is a button click that triggers this action:

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() 方法中的意图与我们之前声明的 REQUEST_CODE 一起使用.

Basically, we are creating an Intent which specifies our current activity (this) and the second activity. We use the intent in the startActivityForResult() method along with the REQUEST_CODE we declared earlier.

现在,在我们的第二个活动中,我们需要一些东西来触发返回的数据.从你问的上一个问题,我假设你想要在单击 RecyclerView 项时将数据返回到主活动.这是我对该问题的部分回答的修改,以显示数据将如何发回.

Now, in our second activity, we need something to trigger the data being returned back. From the previous question you asked, I'm assuming you want data to be returned to the main activity when a RecyclerView item has been clicked. Here is part of my answer to that question modified to show how data will be sent back.

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点击返回列表项的位置.

The above will send back the position of the list item from the RecyclerView clicked.

看看 IntentputExtra() 方法.这就是传递数据.你可以看到我在这个方法中传递了一个字符串 "pos" 和项目 position 的变量,但为什么:

Have a look at the Intent's putExtra() method. This is what passes data. You can see that I have passed a String "pos" and the variable for the item position in this method, but why:

intent.putExtra("key", object);

IntentputExtra 方法总是使用 String 键和另一个对象,例如您的整数变量 position.检索此对象时将再次使用该密钥(稍后我将向您展示).

The putExtra method of Intents always use a String key and another object, such as your integer variable, position. The key will be used again when retrieving this object (as I will show you later).

我们使用 Activity.RESULT_OK 表示我们正在传递结果,但如果您不想发回结果,可以使用 Activity.RESULT_CANCELED -我在开头提到的答案链接中对此进行了解释.请注意,如果您使用 Activity.RESULT_CANCELED,则不需要使用 putExtra,因为没有任何东西可以发回.

We use Activity.RESULT_OK to say that we are passing a result, but you can use Activity.RESULT_CANCELED if you don't want to send back a result - this is explained in the answer link I mentioned at the beginning. Note that if you use Activity.RESULT_CANCELED, you would not need to use putExtra as there would be nothing to send back.

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

Finally, you need to add something into your main activity which will deal with receiving the results from your second activity:

@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 方法.

We use the onActivityResult method for this.

在此方法的开头,我们会检查 requestCode 是否与我们之前定义的相同(作为公共常量,REQUEST_CODE).

At the beginning of this method, we are checking to see if the requestCode is the same as the one we defined earlier (as a public constant, REQUEST_CODE).

如果是这样,我们继续并检查结果的 resultCode 是什么.如果数据被发回 (Activity.RESULT_OK),我们可以使用 getIntExtra() 检索它,因为 position 是一个整数(类似地,使用getStringExtra()(如果您要返回字符串).然后你可以对返回的数据做一些事情.但是,如果数据没有发回(正如我们之前在 Activity.RESULT_CANCELED 中提到的),您可以做其他事情.

If so, we continue and check to see what the resultCode of the result was. If data was sent back (Activity.RESULT_OK), we can retrieve it using getIntExtra() as the position was an integer (similarly, use getStringExtra() if you are returning a String). Then you can do something with the returned data. However, if data was not sent back (as we mentioned earlier with Activity.RESULT_CANCELED), you can do something else.

希望这能帮助你实现你的想法,但谷歌搜索会找到我上面提到的答案(这里是链接再次) 清楚地解释了如何使用 startActivityForResult().这个问题的其他答案也很好地解释了它,但也许您需要有关如何在您的用例中实现它的指导(即结合您上一个问题中的代码),这就是我提供上述解释的原因.

Hopefully this helps you with implementing your idea, but a Google search would've found the answer I mentioned above (here is the link again) which clearly explained how to use startActivityForResult(). Other answers for this question also explain it well, but perhaps you needed guidance on how to implement it in your use case (i.e. combined with your code from the previous question you had), which is why I've provided the explanation above.

您还可以阅读 Android 文档从Activity 以及 [startActivityForResult() 方法](https://developer.android.com/reference/android/app/Activity.html#startActivityForResult(android.content.Intent, int)) 和 Intents.

You can also read the Android documentation on Getting a Result from an Activity as well as Android documentation for the [startActivityForResult() method](https://developer.android.com/reference/android/app/Activity.html#startActivityForResult(android.content.Intent, int)) and Intents.

这篇关于如何使用 StartActivityForResult()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆