【问题标题】:Android Back/Up button and preserving previous intentAndroid Back/Up 按钮并保留以前的意图
【发布时间】:2016-07-30 05:22:01
【问题描述】:

我确定我错过了一些关于后退堆栈及其工作原理的信息,或者我只需要在此处添加几行,但我只是想让我的后退按钮功能正常工作。

Activity A 使用通过 Intent extra 传递的 ID 发出 API 请求以填充其字段(这在 onCreate 中完成)。 Activity B 是从 Activity A 打开的,但是在返回到 Activity A 时,intent 中没有 id,因此无法发出请求。

如何设置导航,以便在启动 Activity B 时保留创建 Activity A 的意图,并在按下后退按钮时重新发送?任何接近此的功能,如果更简单的话,也可能没问题。

到目前为止,当我开始 Activity A 时,我没有做任何特别的事情。 以下是我在 Activity B 中设置后退按钮的方式(以及在清单中将父 Activity 指定为 Activity A):

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar5);
    setSupportActionBar(toolbar);

    // Make sure there is a back button
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);

感谢您提前提供的任何帮助。

我将我的 ID 附加到意图并启动 Activity A:

Intent detailsIntent = new Intent(context, ViewObjActivity.class);
detailsIntent.putExtra("objId", objId);
context.startActivity(detailsIntent);

我从 Activity A 的 onCreate 中的 Intent 中检索我的 ID:

// Get data from extras
Intent detailsIntent = getIntent();
mObjID = detailsIntent.getIntExtra("objId", -1);

修复

经过一番挖掘,我发现默认的后退按钮功能并不是那么好。通过使用以下内容覆盖处理程序,我能够避免存储 ID,因为没有调用 onCreate - 活动的先前状态已经存储。

public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId()== android.R.id.home) {
        finish();
        return true;
    }
    return super.onOptionsItemSelected(item);
}

【问题讨论】:

  • id 是持久的吗? IE。是长期使用还是一次性使用?
  • @sihao 一次性使用。 Activity A 是来自后端的对象的详细信息视图
  • 请发布相关代码,显示您从哪里获取 id 以及您在哪里设置它等。
  • @ShadabAnsari 如果说活动 A 是从一个意图开始的(因为它们都是)还不够,并且其中一个额外是一个名为“id”的 int extra,那么我会邮政编码
  • 我需要看看你是如何获取你传递的 id - 它的声明和初始化。

标签: android android-intent android-navigation


【解决方案1】:

您可以考虑使用此选项。

Activity A到B的意图被激活时,onPause()方法会被执行。

因此,onPause() 方法将是您保存 Activity 状态的好地方。

public static final String SHARED_PREFERENCE = "";

 protected void onPause(){
    super.onPause();

    SharedPreferences settings = getSharedPreferences(SHARED_PREFERENCE,0);
    SharedPreferences.Editor editor = settings.edit();

    editor.clear();
    editor.putInt("ID", id);
    editor.commit();
}

您必须恢复您的 SharedPreferences onResume()onCreate()

【讨论】:

  • 谢谢,这听起来正是我所需要的。 onSavedInstanceState 是我可以从 AppCompatActivity 覆盖的方法吗?我没有看到它,但我看到了 onPostCreate(savedInstanceState:Bundle),但不确定这是否有帮助
  • 没关系,它被称为 onSaveInstanceState 没有'd'......谢谢!
  • 我想你可以,你应该从 Activity 类中覆盖它。 AppCompatActivity 是 Activity 的子级。
  • 好的。所以我覆盖了它,并将代码添加到 onCreate 以进行条件赋值,但似乎实例状态没有被保存。在 onSaveInstanceState 我写state.putInt("objId", mObjId) 然后在 onCreate 我检查 savedInstanceState 是否不为空,然后它是否包含正确的键,当我返回 ActivityA 时它会落入 else 进行检查。为了真正拯救国家,我需要做些什么额外的事情吗?我以一个简单的空意图启动 Activity B 并调用 startActivity。
  • 对不起,我没有真正理解这一行“如果它包含正确的密钥,并且当我返回 ActivityA 时它会落入 else 进行检查。”
猜你喜欢
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 2012-06-11
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多