【问题标题】:onBackPressed not calls after recreate()onBackPressed 在 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 中写的代码是什么?
  • 我也有这个问题。但并非在所有设备上!在所有模拟器(我测试过的)中,它都能正常工作;在物理设备中没有。我不明白发生了什么。
  • 你能发布这个活动的完整代码吗?
  • 你找到那个解决方案了吗?

标签: android back-button onbackpressed 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-18
        相关资源
        最近更新 更多