我正在开发一个待办事项列表Android应用程序(它恰好用于课堂作业,但这不是我要求的 - 我试图省尽尽可能多的代码)。主屏幕显示ToDo项目列表,底部有一个按钮,用于打开Add New ToDo Item屏幕。
在Add New ToDo Item屏幕上,有一个Cancel按钮。
相关ToDoManagerActivity.java片段:
public void onCreate(Bundle savedInstanceState) {
// Init and setup adapter, etc.
footerView.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(ToDoManagerActivity.this, AddToDoActivity.class);
startActivityForResult(intent, ADD_TODO_ITEM_REQUEST);
}
});
// Attach the adapter to this ListActivity's ListView
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
log("Entered onActivityResult()");
// Check result code and request code.
// If user submitted a new ToDoItem
// Create a new ToDoItem from the data Intent
// and then add it to the adapter
}
相关的AddToDoActivity.java片段:
protected void onCreate(Bundle savedInstanceState) {
// Initialize default view, handle other events, etc.
final Button cancelButton = (Button) findViewById(R.id.cancelButton);
cancelButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
setResult(RESULT_CANCELED, new Intent());
finish();
}
});
}
以上代码有效。以前,我在onClick
的{{1}}处理程序中尝试此操作:
cancelButton
当我点击取消按钮时,我可以看到日志中已到达public void onClick(View v) {
finishActivity(RESULT_CANCELED);
}
,但屏幕未恢复到主要待办事项列表屏幕。
为什么上面的代码没有将我返回到上一个屏幕,但以下代码确实将我返回到上一个屏幕?我对任务后台/活动的误解是什么?
onActivityResult
答案 0 :(得分:1)
public void finish()
在您的活动完成后调用此选项并应关闭。 ActivityResult会传播回通过您发送给您的任何人 onActivityResult()。
和
public void finishActivity(int requestCode)
强制完成之前使用startActivityForResult(Intent,int)启动的另一个活动。
您应致电finish()
以关闭当前活动,并finishActivity()
关闭您使用startActivityForResult(Intent intent, int requestCode)
开始的其他活动。在当前活动上调用finishActivity()
不会关闭它。
此外,为Intent
创建新的setResult()
没有意义,因为您没有传回任何数据。这样做就足够了:
setResult(RESULT_CANCELED);
finish();
答案 1 :(得分:0)
来自Android文档:
public void finishActivity(int requestCode) 强制完成您之前使用startActivityForResult(Intent,int)启动的另一个活动。
finishActivity不会完成当前活动,但会调用使用requestCode
调用的活动的完成答案 2 :(得分:0)
如果您查看finishActivity()
的{{3}},则表示会强制完成以startActivityForResult()
开头的活动,但您必须传入您曾经开始使用的请求代码另一项活动。在您的情况下,它将是ADD_TODO_ITEM_REQUEST
。
这可能不是您要使用的API。你的第二种方法更清洁,因为你不需要强制关闭子活动,而是让它以正常方式完成。