什么工作正常
我的应用程序中有2个活动.第一项活动称第二次获得结果.
第二个活动显示新布局,并允许用户执行某些操作.有一个"确定"按钮.当用户按下此按钮时,第二个活动结束,用户返回第一个活动.
在引擎盖下,第一个活动调用第二个活动,如下所示:
Intent intent = new Intent(this, NextAct.class);
intent.putExtra("input", input);
this.startActivityForResult(intent, 99);
Run Code Online (Sandbox Code Playgroud)
按"确定"按钮,第二个活动返回结果如下:
Intent intent = new Intent();
intent.putExtra("output", output);
setResult(RESULT_OK, intent);
finish();
Run Code Online (Sandbox Code Playgroud)
之后,第一个活动的onActivityResult被成功调用结果:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// requestCode is 99
// resultCode is -1
// data holds my output
}
Run Code Online (Sandbox Code Playgroud)
以上设置工作正常
什么不起作用
现在我有一个简单的要求,我希望用户不要使用"OK"按钮关闭第二个活动,而是以"HARDWARE BACK"按钮自然地关闭.
我尝试在第二个活动的onStop和onDestroy方法中移动setResult逻辑,但事实证明第一个活动的onActivityResult在第二个活动的onStop或onDestroy方法之前被调用,因此setResult逻辑根本没有机会运行.
然后我尝试在第二个活动的onPause方法中移动setResult逻辑,就像这样
protected void onPause() {
super.onPause();
Intent intent = new Intent();
intent.putExtra("output", output);
setResult(RESULT_OK, intent);
//finish(); enabling or disabling this does not work
}
Run Code Online (Sandbox Code Playgroud)
但是虽然在onActivityResult和setResult逻辑正常运行之前调用了onPause,但仍然在onActivityResult中获取所有空值
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// requestCode is 99
// resultCode is 0
// data comes as null
}
Run Code Online (Sandbox Code Playgroud)
我需要知道为什么会发生这种情况,如果onResume不是放置setResult逻辑的合适位置,那么最自然的方法是什么?
非常感谢.
Com*_*are 13
现在我有一个简单的要求,我希望用户不要使用"OK"按钮关闭第二个活动,而是以"HARDWARE BACK"按钮自然地关闭.
对于startActivityForResult()场景而言,这通常不是"自然的" .BACK按钮应该允许用户告诉你"不,它不正常"(即取消).
这并不意味着你必须有一个OK按钮.例如,如果NextAct是a ListActivity,则典型模式是单击列表项以被视为"OK"(即,call setResult()和finish()from onListItemClick()),而BACK表示"我真的不想开始NextAct,抱歉".
我需要知道为什么会这样
你来电setResult()太晚了.如果用户按下BACK,则到时onPause(),结果(RESULT_CANCELED)已经确定.
如果onResume不是放置setResult逻辑的适当位置
onResume() 不会是"放置setResult逻辑"的合适位置
什么是最自然的方式呢?
可能你点击OK按钮就是"最自然的方式".
但是,如果由于某些奇怪的原因你确实希望BACK按钮表示"OK",则在链接到超类之前覆盖onBackPressed()并调用setResult()它super.onBackPressed().
我发现的最好方法是覆盖finish()方法:
@Override
public void finish() {
Intent data = new Intent();
data.putExtra(INTENT_PARAM_OPTIONS, options);
setResult(RESULT_OK, data);
super.finish();
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,即使用户按下后退按钮(或活动栏向上按钮),您的活动也将始终返回数据.
我认为在某些情况下这样做是完全自然的.如果您有一项活动用于编辑一个大型实体(例如装运订单),并且该活动中的一个较小的活动会修改大型实体的一小部分(送货地址),您可能还会将所有更改保存在较小的活动中,因为用户可以通过取消大活动来取消所有更改.
| 归档时间: |
|
| 查看次数: |
7608 次 |
| 最近记录: |