在重新创建()后onBackPressed不调用

时间:2016-06-15 10:14:46

标签: android back-button onbackpressed recreate

问题描述:

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

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

Home按钮工作没有问题,Back按钮在开始时工作,但如果用户在Settings Activity中,关闭它并返回到Main Activity,onBackPressed()函数不再被调用。

如果我删除了娱乐,则“返回”按钮工作正常,就像“主页”按钮一样。

所以如果有人知道为什么要重新创建()搞乱Back按钮?

感谢。

部分相关代码:

主要活动:

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

}

3 个答案:

答案 0 :(得分:1)

只需将UNION方法替换为

recreate()

&看魔术。 您无需重新设置任何finish(); startActivity(getIntent()); bundle

答案 1 :(得分: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);

答案 2 :(得分: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的完整代码,我将更新答案,以便我们可以帮助其他人。