在我的应用程序中,我在Manifest文件中定义了2个活动:
<activity android:name=".event.EventDetailsActivity"
android:launchMode="singleTop"
android:parentActivityName=".main.MainActivity"
android:theme="@style/AppTheme.WithActionBar"/>
<activity
android:name=".main.MainActivity"
android:launchMode="singleTop"/>
在MainActivity
中,我有4个片段。在一个片段中,我使用以下命令在一个片段中启动EventDetailsActivity
:
Intent intent = new Intent(new Intent(getContext(), EventDetailsActivity.class));
intent.putExtra(EventDetailsActivity.ID_KEY, id);
intent.putExtra(EventDetailsActivity.TYPE_KEY, true);
startActivityForResult(intent, DETAILS_REQUEST);
我如何处理EventDetailsActivity
中的后退导航:
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onSupportNavigateUp() {
Log.d(TAG, "Navigate up");
onBackPressed();
return true;
}
@Override
public void onBackPressed() {
Log.d(TAG, "Back pressed " + isChanged);
if (isChanged) {
Log.d(TAG, "Set result");
setResult(RESULT_OK);
finish();
}
super.onBackPressed();
}
问题是onActivityResult
在调用Fragment
中调用,但结果代码始终为0 (RESULT_CANCELED)
。此外,如果按下后退箭头按钮,onSupportNavigateUp
永远不会被调用。这个问题有解决办法吗?
答案 0 :(得分:1)
删除:android:launchMode="singleTop"
并删除onBackpressed函数中的super.onBackpressed
因为你使用了finish()
答案 1 :(得分:0)
当您正确地从onActivityResult
获取Fragment
回调时,我认为问题在于将正确的结果设置为起始Activity
。所以我在这里提出了一些您可能会在代码中考虑的编辑内容。
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
setResult(RESULT_OK);
return true;
}
return super.onOptionsItemSelected(item);
}
// No longer necessary
/* @Override
public boolean onSupportNavigateUp() {
Log.d(TAG, "Navigate up");
onBackPressed();
return true;
} */
/* @Override
public void onBackPressed() {
// Super call needs to be the first line
super.onBackPressed();
if (isChanged) {
setResult(RESULT_OK);
}
} */
所以我省略了onBackPressed
功能,因为默认情况下,如果用户按下后退按钮,结果将是Activity.RESULT_CANCELED
。
所以这里有一个hacky解决方案就是像这样实现关键事件回调监听器。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK)) {
setResult(RESULT_OK);
finish();
}
return super.onKeyDown(keyCode, event);
}
希望有所帮助!