首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在recreate()之后不调用onBackPressed

在recreate()之后不调用onBackPressed
EN

Stack Overflow用户
提问于 2016-06-15 18:14:46
回答 3查看 750关注 0票数 5

问题描述:

我的App有Main Activity和Setting activity每次关闭设置活动后,Main活动都会重新创建。

可以在两个地方通过finish()关闭主要活动(应用程序退出):操作栏中的主页按钮和后退按钮(硬件或弹出栏)。

主页按钮正常工作,后退按钮在开始时工作,但如果用户在设置活动中,关闭它并返回主活动,则不再调用onBackPressed()函数。

如果我删除娱乐,后退按钮工作正常,就像主页按钮一样。

那么,如果有人知道为什么recreate()搞砸了Back按钮呢?

谢谢。

相关代码部分:

主要活动:

代码语言:javascript
复制
@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {

        // Open Settings Activity
        case R.id.menuSettings:

            Intent intent = new Intent(this, SettingsActivity.class);
            startActivityForResult(intent, REQUEST_SETTINGS);

            return true;

        // Close the App
        case android.R.id.home:

            finish();

            return true;

        default:
            return super.onOptionsItemSelected(item);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode != RESULT_OK) {

        return;
    }

    switch (requestCode) {

        case REQUEST_SETTINGS:

            // Recreate activity
            recreate();

            break;
    }
}

// Close App on Back Button Click
@Override
public void onBackPressed() {
    super.onBackPressed();

    finish();
}

}

EN

回答 3

Stack Overflow用户

发布于 2018-09-05 22:05:21

只需将recreate()方法替换为

代码语言:javascript
复制
finish();
startActivity(getIntent());

&看魔术。您不需要重新设置任何bundleintent

票数 1
EN

Stack Overflow用户

发布于 2017-01-30 05:09:55

我找到了一个解决方案。

在调用recreate()方法之前,似乎需要完成一些事情。我在onResume内部调用它,而你在onActivityResult方法内部调用它。

因此,我专门为它提供了一点喘息之机,以完成它的进程(100毫秒对我来说很好)。

这是我的解决方案:

代码语言:javascript
复制
// Use this instead of calling recreate() directly. 
// This will call recreate() after 100 milliseconds, ASYNCHRONOUSLY:
new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                recreate();
            }
        }, 100);
票数 0
EN

Stack Overflow用户

发布于 2017-02-12 17:08:05

因为执行了super.onBackPressed(),所以您的完成可能不会像预期的那样工作。

另外,finish并不会关闭你的应用程序,它只是完成了活动。如果backstack上有另一个activity,它将打开那个activity。这在您的应用程序逻辑中可能是很好的,但请记住这一点。

其他:我不能重现你的问题,所以你的问题可能在别的地方。这是我用来重现问题的代码:

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                recreate();
            }
        });
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        finish();
    }
}

我才意识到这是一个古老的问题。如果你仍然有它,请提供MainActivity的完整代码,我将更新答案,以便我们可以帮助其他人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37832489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档