当用户按下后退按钮时,将忽略setResult

时间:2016-08-28 11:04:30

标签: android android-fragments android-navigation

在我的应用程序中,我在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永远不会被调用。这个问题有解决办法吗?

2 个答案:

答案 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);
}

希望有所帮助!