NavController 无法以编程方式弹出堆栈中最新的 @Composable。即,如果它是根页面,则 popBackStack() 不起作用。因此,可以通过点击“关闭”按钮视图来关闭应用程序,并且只有硬件后退键允许离开应用程序。
示例:活动
class AppActivity : ComponentActivity() {
override fun onCreate(state: Bundle?) {
super.onCreate(state)
setContent {
val controller = rememberNavController()
NavHost(controller, startDestination = HOME) {
composable(HOME) { HomePage(controller) }
...
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
主页.kt
@Composable
fun HomePage(controller: NavController) {
Button(onClick = {
controller.popBackStack()
}) {
Text("Exit")
}
}
Run Code Online (Sandbox Code Playgroud)
问题:
如果使用 Compose Navigation,如何在 onClick 处理程序中关闭应用程序。
我需要为应用程序中的所有屏幕禁用活动过渡动画。先前的解决方案适用于所有Android版本:
<style name="base_theme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowAnimationStyle">@null</item>
</style>
Run Code Online (Sandbox Code Playgroud)
...但是对于Android 8“ Oreo”,每次转换(前进或后退)都会导致黑屏闪烁。也就是说,仍然没有任何动画,但是会发生非常烦人的闪烁(90%的机会,约20-30毫秒,整个屏幕)。
根据我的“研究”:
我能找到的唯一解决方案:
定义一个空的过渡动画
<?xml version="1.0" encoding="utf-8"?>
<set />
Run Code Online (Sandbox Code Playgroud)
并将其应用于应用程序中的每个活动(onCreate&finish)
overridePendingTransition(R.anim.animation_activity_none, R.anim.animation_activity_none);
Run Code Online (Sandbox Code Playgroud)
题:
这是对Oreo(即功能),平台错误或应用程序问题的某种新限制吗?还有其他解决方案吗?
[更新]
还有一个发现。确保在主线程上调用Activity finish()和overridePendingTransition()对!否则会发生线程争用并且有时不应用overridePendingTransition。
[更新]
Google已经确认这是Android 8.0中的错误,大概是在8.1中修复的。因此,“空动画”修复将持续数年,直到minSdkVersion == 27。