在我的应用中,我需要向用户询问快速 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();
答案 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))和Intent
s的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);