在我的应用程序中,我需要快速询问用户 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
发回列表项的位置点击。看看
Intent
的putExtra()
方法。这就是传递数据的方式。可以看到我传递了一个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/