向上按钮调用父 Activity 的 OnDestroy

2024-02-13

首先,我想澄清一些事情:我正在努力使用的按钮不是back按钮。我指的是up/home应用程序顶部的 ActionBar / Toolbar 中的按钮,而不是底部的 Android 按钮。有几个posts https://stackoverflow.com/questions/20819019/why-is-ondestroy-always-called-when-returning-to-parent-activity具有类似的性质,但它们处理后退按钮,而不是向上按钮。

情况如下:我有一个 Activity A,其中有一个 ListView 片段。当用户单击列表视图项时,它会启动 Activity B。非常典型。活动 A 有一个EditText工具栏中的字段允许用户输入搜索参数。如果用户点击up/home按钮从活动 B,我成功返回到活动 A。但是,我希望活动 A 在EditText他们离开时就在那里的田地。如果用户点击back按钮,该文本被恢复。但如果他们用up/home按钮,EditText字段为空。

使用一些日志语句,我可以看到当从活动 A 中点击列表项时,onSaveInstanceState and onStop都被称为(但是onDestroy此时未调用。)从活动 B 中,当up/home按钮被点击,onDestroy活动 A 是立即地调用,然后是onCreate等等。但是,捆绑包savedInstanceState为空,大概是因为onDestroy刚刚被叫到。

Why is onDestroy返回 Activity A 时调用?这对我来说毫无意义。这是我在清单中的内容:

<activity
  android:name=".Activity.ActivityA"
  android:label="@string/app_name"
  android:parentActivityName=".Activity.ParentActivity"
  android:theme="@style/AppTheme"
  android:launchMode="singleTop"
  android:windowSoftInputMode="stateVisible" />

<activity
  android:name=".Activity.ActivityB"
  android:label="@string/app_name"
  android:parentActivityName=".Activity.ActivityA"
  android:theme="@style/AppTheme" />

以下是Activity A中的相关方法:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        actionBar = getSupportActionBar();

        if (actionBar != null)
            initializeActionBar();

        if (getSupportActionBar() != null)
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        Log.d(TAG, "on create");

        if (savedInstanceState != null) {
            Log.d(TAG, "saved instance state not null");
            if (savedInstanceState.getString("search_text") != null)
                etSearch.setText(savedInstanceState.getString("search_text"));
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("search_text", etSearch.getText().toString());
        Log.d(TAG, "on Save instance state");
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);

        Log.d(TAG, "on restore instance state");

        if (savedInstanceState != null) {
            if (savedInstanceState.getString("search_text") != null)
              etSearch.setText(savedInstanceState.getString("search_text"));
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "on resume");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "on stop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "on destroy");
    }

private void initializeActionBar() {

    actionBar.setCustomView(R.layout.actionbar_with_edittext);

    etSearch = (EditText) actionBar.getCustomView().findViewById(R.id.actionbar_searchfield);
    etSearch.setOnEditorActionListener(new TextView.OnEditorActionListener() {

        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

            if(event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
                initiateNewSearch();
                etSearch.clearFocus();

            }

            return false;
        }
    });

    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(etSearch, InputMethodManager.SHOW_IMPLICIT);
    etSearch.requestFocus();
}

我不认为 Activity B 中的任何代码与此相关。

这是当用户点击活动 A 中的列表视图项时我的控制台输出:

保存实例状态
on stop

这就是当用户点击时生成的up/home活动 B 中的按钮:

销毁时
在创建时
简历上

如果还有什么可能有帮助,请告诉我。感谢您的任何建议!


我不知道为什么默认的向上按钮实现会创建一个新活动,但对我来说一个可行的解决方案是覆盖onOptionsItemSelected:

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

这个解决方案也适用于我:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                Intent intent = NavUtils.getParentActivityIntent(this);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
                        | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                NavUtils.navigateUpTo(this, intent);
                return true;
            default:
                break;
        }
        return super.onOptionsItemSelected(item);
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

向上按钮调用父 Activity 的 OnDestroy 的相关文章

随机推荐

  • 如何强制输入只允许字母?

    此处使用 jQuery 但无法阻止在输入字段中输入数字 http codepen io leongaban pen owbjg http codepen io leongaban pen owbjg Input
  • Javascript 的正则表达式lookbehind 解决方法?

    我在正则表达式方面很糟糕 所以我会以尝试更好地描述我的问题的名义 以一种非常规的方式传达我的问题 var TheBadPattern d 2 d 2 d 2 d 3 var TheGoodPattern a zA Z0 9 r n n a
  • raise ValueError('Fileobj 必须实现 read')

    我正在获取文件大小并将其上传到 S3 def transfer file from ftp to s3 bucket name ftp file path s3 file path ftp username ftp password chu
  • AVAssetWriter 仅在 iOS 13 设备上有音频“爆裂声”

    我使用 AVCaptureSession 使用 AVAssetWriter 写入 mov 文件 同样的代码在 iOS 13 之前的设备上不会出现裂纹 在所有 iOS 13 设备上 无论 iPhone iPad 型号如何 都会出现爆裂声 我已
  • Eigen SparseMatrix 的零拷贝构造

    我有以下问题 我有一个Eigen SparseMatrix我需要通过网络发送 而我的网络库仅支持发送原始类型的数组 我可以通过执行类似的操作来检索指向 SparseMatrix 的支持数组的指针 这是支持对象的代码 https eigen
  • extjs 5:为组件的自定义属性进行数据绑定

    我有一个从文件字段扩展的组件 我向其中添加了一个自定义属性 serverPath 并且我还定义了 getter 和 setter 代码 Ext define MyApp ux Field File extend Ext form field
  • 是否可以使用 Node.js 创建桌面应用程序? [复制]

    这个问题在这里已经有答案了 我已经使用node js 创建了一个应用程序 我很想知道是否可以将客户端 js html css 和服务器端打包到一个独立的应用程序 不需要浏览器 中 https github com rogerwang nod
  • 如何使用 vc++ 找出当前线程的堆栈上剩余多少空间?

    我使用的是VC 2012 我希望能够知道当前线程中有多少堆栈内存可用 快速搜索指向使用 malloc h 和 stackavail 函数 但它在 Visual C 2012 中不存在 我如何以另一种方式实现这一点 有问题的例子是这样的 in
  • 在“in”子句的存储过程中使用MySQL用户定义变量

    当将逗号分隔的 id 字符串作为 varchar 发送到 MySQL 存储过程时 我无法使用该字符串作为 IN 子句的一部分来返回正确的结果 该字符串被截断为小数 并且仅使用第一个值 我以为我可以通过准备然后执行该语句来解决这个问题 但这仍
  • 如何(从命令行)自动安装适用于 C++、.NET、C# 等的 Visual Studio 构建工具构建环境

    注 我已经读过如何在不安装 IDE 的情况下在构建服务器上安装 VS2017 版本的 msbuild https stackoverflow com questions 42696948 how can i install the vs20
  • 未选中复选框时如何删除相邻单元格的数据?

    我想以此作为序言 因为我没有接受过这一专业领域的培训 因此我帮助设置了该表的初始代码 我设置了工作表 以便在 A 列和 C 列中添加复选框 并在 B 和 D 中添加时间戳 但我也希望这样 如果需要取消选中复选框 则数据将被删除 A B C
  • 如何从 Django 的会话中获取登录用户的 uid?

    我已经使用以下方法实现了注册 登录 身份验证系统这个 Django 指南 https docs djangoproject com en 1 3 topics auth 但是 我如何从我的视图访问用户的信息 以便将用户的信息发送到模板文件
  • 简单的客户端/服务器、TCP/IP 加密消息流、SSL

    编写一个小型 TCP IP 客户端服务器应用程序 基本上它会创建一个服务器 然后您可以创建几个不同的客户端并设置一些聊天会话 我想知道是否有任何方法可以使用标准 net 库合并某种形式的加密 m mainSocket new Socket
  • 从 HTTPS 页面到 HTTP URL 的 AJAX 请求

    我有一种情况 我需要从一个 HTTPS 页面到另一个不安全的页面 在不同的域上 执行 AJAX 请求 我们已经实施了 CORS 策略 并且在我们的网站上使用 HTTPS 之前它运行良好 有什么办法可以让这个工作吗 根据 W3 的说法 由于
  • 将文件和目录连同提交历史记录一起移动到子目录中

    如何将目录和文件以及提交历史记录移动到子目录 例如 源码目录结构 project x files sub dirs 目标目录结构 project x p q files sub dirs 要添加到布马古利斯 https stackoverf
  • .Net lib来控制远程GDB [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 您可以对遗留代码库做哪些对提高质量影响最大的事情?

    当您在遗留代码库中工作时 随着时间的推移 什么会对提高代码库的质量产生最大的影响 删除未使用的代码 删除重复的代码 添加单元测试以提高覆盖率较低的测试覆盖率 跨文件创建一致的格式 更新第三方软件 减少静态分析工具 即 Findbugs 生成
  • 具有 CSS 和 HTML 的水平家谱 - 反向

    我在网上搜索并找到了一个很好的家谱示例在代码笔这里 http codepen io anon pen bdLeNe 我想要同样的东西 但旋转了180度 我想以 16 名成员开始我的家谱 并从左到右降序 16 8 4 2 1 如何通过使用 编
  • del 语句与调用 __delitem__ 总是 100% 相同吗?

    a something iterable object in python del a 1 Is del a 1 总是一样a delitem 1 是Python吗del语句定义为调用 delitem method The del陈述 htt
  • 向上按钮调用父 Activity 的 OnDestroy

    首先 我想澄清一些事情 我正在努力使用的按钮不是back按钮 我指的是up home应用程序顶部的 ActionBar Toolbar 中的按钮 而不是底部的 Android 按钮 有几个posts https stackoverflow