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());
& 看看魔法。
不需要新设置bundle
和intent
。
【讨论】:
【参考方案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() 后不调用的主要内容,如果未能解决你的问题,请参考以下文章
将 overridePendingTransition 与 recreate() 结合使用。可以做到吗?
调用 recreate() 方法时 TextInputLayout 提示不会刷新