android - 如何使用 StartActivityForResult()

标签 android android-fragments

在我的应用程序中,我需要快速询问用户 input .

我需要从这个 得到结果快闪 Activity 然后回到上一个。

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

编辑:

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

在我的第二个 Activity 中(我需要从中获取结果的 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();

我需要将结果带到我的主要 Activity :
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()启动一个新 Activity 并从那里返回输入。

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

所以,你需要了解 startActivityForResult()有两个参数:

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

  • 为您的请求代码使用一个常量是一种很好的做法,您可以在两个 Activity 中访问该常量。例如,在您的主要 Activity 中,您可以添加:
    public static final int REQUEST_CODE = 1;
    

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

    在您的主要 Activity 中,您需要一个 Action (例如按下按钮)来开始您的第二个 Activity 。假设是一个按钮点击触发了这个 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它指定了我们当前的 Activity (this)和第二个 Activity 。我们使用 startActivityForResult() 中的 Intent 方法以及 REQUEST_CODE我们之前声明过。

    现在,在我们的第二个 Activity 中,我们需要一些东西来触发返回的数据。来自 the previous question you asked ,我假设您希望在 RecyclerView 时将数据返回到主要 Activity 。项目已被点击。这里是 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 发回列表项的位置点击。

    看看IntentputExtra()方法。这就是传递数据的方式。可以看到我传递了一个String "pos"和项目的变量 position在这种方法中,但为什么:
    intent.putExtra("key", object);
    
    putExtra Intent的方法s 总是使用一个字符串键和另一个对象,比如你的整数变量,position .检索此对象时将再次使用该 key (稍后我将向您展示)。

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

    最后,您需要在主要 Activity 中添加一些内容,以处理接收第二个 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方法。

    在这个方法的开始,我们检查 requestCode与我们之前定义的相同(作为公共(public)常量 REQUEST_CODE )。

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

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

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

    关于android - 如何使用 StartActivityForResult(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37768604/

    相关文章:

    即使在应用程序启动后,Android 短信接收器也无法在 ICS 中工作

    android - 在 fragment 中使用FragmentManager?

    java - Android NullPointerException getActivity()

    java - 我来自 XML 的 VIEWS 或 WIDGETS 无法在扩展 fragment 类的类上使用 java

    java - 错误致命异常 : AsyncTask #1 android

    android - 值错误 : Linkname is too long

    c# - Uno 平台 Android 启动画面确实完全消失

    android - 从 strings.xml 中提取值

    android - fragment 的 savedInstanceState 是否与父 Activity 的 savedInstanceState 共享?

    android - 如何使用前一个 fragment 的 EditText 输入更改 fragment 中的 TextView?