onBackPressed 在 recreate() 后不调用

Posted

技术标签:

【中文标题】onBackPressed 在 recreate() 后不调用【英文标题】:onBackPressed not calls after recreate() 【发布时间】:2016-10-16 09:28:22 【问题描述】:

问题描述:

我的应用有主要活动和设置活动。每次关闭 Settings Activity 后,Main Activity 都会重新创建。

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

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

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

如果有人知道为什么 recreate() 会搞乱后退按钮?

谢谢。

部分相关代码:

主要活动:

@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();

【问题讨论】:

也许你应该阅读一下启动器模式developer.android.com/guide/topics/manifest/… recreate 中写的代码是什么? 我也有这个问题。但并非在所有设备上!在所有模拟器(我测试过的)中,它都能正常工作;在物理设备中没有。我不明白发生了什么。 你能发布这个活动的完整代码吗? 你找到那个解决方案了吗? 【参考方案1】:

只需将recreate() 方法替换为

finish();
startActivity(getIntent());

& 看看魔法。 不需要新设置bundleintent

【讨论】:

【参考方案2】:

您的完成可能无法按预期工作,因为您执行了 super.onBackPressed()。

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

其他问题:我无法重现您的问题,因此您的问题可能在其他地方。这是我用来重现您的问题的代码:

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 代码,我会更新答案,以便我们可以帮助其他人。

【讨论】:

【参考方案3】:

我找到了解决办法...

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

所以我花了一点时间来完成它的流程(100 毫秒对我来说效果很好)。

这是我的解决方案:

// 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);

【讨论】:

以上是关于onBackPressed 在 recreate() 后不调用的主要内容,如果未能解决你的问题,请参考以下文章

Android 在活动 recreate() 上进行转换

Activity中recreate方法的应用

将 overridePendingTransition 与 recreate() 结合使用。可以做到吗?

调用 recreate() 方法时 TextInputLayout 提示不会刷新

调用 Activity.Recreate() 后维护我的 Activity 后台堆栈的最佳方法是啥?

可以给 recreate() 一个过渡动画吗?