5

问题描述:

我的应用程序有主要活动和设置活动。每次关闭 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();
}

}

4

3 回答 3

1

只需将recreate()方法替换为

finish();
startActivity(getIntent());

并看到魔法。你不需要设置任何新的bundleintent

于 2018-09-05T14:05:20.873 回答
0

我找到了解决方案...

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);
于 2017-01-29T21:09:55.377 回答
0

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

另请注意,完成不会关闭您的应用程序,它只会完成活动。如果 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 的完整代码,我会更新答案,以便我们可以帮助其他人。

于 2017-02-12T09:08:04.773 回答