即使我刚刚意识到操作栏后退按钮在我的应用程序中并不是完全必要的(因为页脚菜单中已经存在对所有屏幕的访问),我也需要了解为什么它使我的应用程序无响应。
从必要的信息开始,我首先说我的主要活动是 “TestTypeMenuActivity” 并且所有活动都继承自名为 “BaseActivity” 的基本活动。
让我们以我的一项活动为例,CollegeSearchActivity:
在我的 AndroidManifest 中,我定义了它并将其父级设置为主要活动,如下所示:
<activity
android:name=".ui.activities.main.collegesearch.CollegeSearchActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".ui.activities.test.testtypemenu.TestTypeMenuActivity" />
</activity>
在大学搜索活动中:
override fun createActionBar() {
val activityTitle = TMLocale.getStringResourceByResId(R.string.activitycommunity_textview_findcolleges).uppercase()
super.createActionBar(activityTitle, showBackButton = true, capitalizeTitle = true)
}
在基本活动中:
fun createActionBar(title: String, showBackButton: Boolean, capitalizeTitle: Boolean){
if(useToolBar){
val toolbar = this.createToolbar(title, capitalizeTitle)
if (toolbar!=null) setSupportActionBar(toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(showBackButton)
val toolbarColor = getActivityTextColor()
toolbar?.setNavigationIconColor(Color.parseColor(toolbarColor))
}
}
扩展方法类:
fun Activity.createToolbar(actionbarTitle: String, capitalizeTitle: Boolean = true): Toolbar? {
val toolbar = findViewById<Toolbar>(R.id.toolbar)
if (toolbar != null) {
this.setActionBarBackground(toolbar)
val capitalizedTitle = if (capitalizeTitle)
WordUtils.capitalizeFully(actionbarTitle) else actionbarTitle
val tvActionBarTitle = toolbar.findViewById<TextView>(R.id.tvActionBarTitle)
val textColor = BaseActivity.getAppTextColor(context)
tvActionBarTitle.setTextColor(Color.parseColor(textColor))
if (tvActionBarTitle != null) tvActionBarTitle.text = capitalizedTitle
}
return toolbar
}
直到现在一切都工作正常,突然操作栏中的后退按钮开始使我的应用程序无响应,我不明白为什么。
奇怪的是,如果我插入下一行 - 从这里获取: 当我按下设置菜单中的向上(后退)按钮时应用程序崩溃 - 到我的 BaseActivity 中,问题就会消失:
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == android.R.id.home) {
super.onBackPressed()
return true
}
return super.onOptionsItemSelected(item)
}
我需要理解为什么问题开始发生(以及为什么这些行解决了它),而直到现在才需要它。
有什么帮助吗?
编辑 1:添加 logcat 输出。
在访问任何屏幕后清除了 logcat,在我点击后退按钮后,这是 logcat 输出。
2024-04-29 19:49:39.261 2431-4576 ThermalTraceService com.huawei.iaware I code:1, appInfo:com.xxx.xxx#10000, levelInfo:0,warm_system_h,7
2024-04-29 19:49:39.527 4864-4864 Settings com...xxx.xxx W Setting device_provisioned has moved from android.provider.Settings.Secure to android.provider.Settings.Global.
2024-04-29 19:49:39.528 4864-4864 HiTouch_HiTouchSensor com...xxx.xxx V User setup is finished.
2024-04-29 19:49:39.740 4864-4864 AudioManager com...xxx.xxx V querySoundEffectsEnabled...
2024-04-29 19:49:43.090 4864-4929 ZrHungImpl com...xxx.xxx I sendRawEvent. wpId = 257
2024-04-29 19:49:43.092 4864-4929 HiView.HiEvent com...xxx.xxx E length is 0 or exceed MAX: 1024
2024-04-29 19:49:45.405 4864-4929 ZrHungImpl com...xxx.xxx I sendRawEvent. wpId = 258
2024-04-29 19:49:45.405 4864-4929 HiView.HiEvent com...xxx.xxx E length is 0 or exceed MAX: 1024
2024-04-29 19:49:47.537 4864-4885 lsatactexampre com...xxx.xxx I Background concurrent copying GC freed 109772(6560KB) AllocSpace objects, 0(0B) LOS objects, 49% free, 8312KB/16MB, paused 150us total 103.835ms
2024-04-29 19:49:54.273 2431-4576 ThermalTraceService com.huawei.iaware I code:1, appInfo:com.xxx.xxx#10000, levelInfo:0,warm_system_h,6#0,warm_systemh_screenoff,1
2024-04-29 19:49:56.395 4864-4885 lsatactexampre com...xxx.xxx I Background concurrent copying GC freed 111727(6869KB) AllocSpace objects, 0(0B) LOS objects, 49% free, 10034KB/19MB, paused 122us total 112.971ms
2024-04-29 19:50:09.785 4864-4885 lsatactexampre com...xxx.xxx I Background concurrent copying GC freed 132123(7836KB) AllocSpace objects, 0(0B) LOS objects, 49% free, 12MB/24MB, paused 215us total 124.915ms
2024-04-29 19:50:19.288 2431-4576 ThermalTraceService com.huawei.iaware I code:1, appInfo:com.xxx.xxx#10000, levelInfo:0,warm_system_h,5
此代码片段覆盖
onOptionsItemSelected
方法,该方法在选择选项菜单项时调用....在您的情况下是操作栏后退按钮
在方法内部,有一个
if
语句,用于检查所选菜单项的 ID 是否等于 android.R.id.home
。此 ID 通常代表应用程序主页/向上按钮
如果选定的菜单项主页/向上按钮调用方法,则调用从 super.onBackPressed()
类继承的方法
Activity
。此方法模拟按下 back
按钮,通常将用户导航到上一个屏幕,或者如果没有上一个屏幕则关闭当前活动
如果按下主页/向上按钮并触发后退导航,方法将返回
true
。然后调用 onOptionsItemSelected
的超类实现来处理其他菜单项选择并返回结果
因此,此代码确保当在选项菜单中按下主页/向上按钮时,会调用活动
onBackPressed()
方法来处理导航,从而提供与后退按钮一致的行为
我想这就是您正在寻找的。
更多信息: