6.7.0 - Alpha21 - 修复代码编辑器切换工具栏后按钮状态可能不同步的问题

This commit is contained in:
SuperMonster003
2026-02-24 01:19:53 +08:00
parent af328d0ca0
commit 427c671f1c

View File

@@ -1217,13 +1217,16 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag
private fun setMenuItemStatus(id: Int, enabled: Boolean) {
mMenuItemStatus.put(id, enabled)
// Always update the normal toolbar cache as well, so switching toolbars won't lose state.
// zh-CN: 同时更新普通工具栏的缓存, 避免切换工具栏后状态丢失.
mNormalToolbar.setMenuItemStatus(id, enabled)
// Also update current visible toolbar fragment if exists.
// zh-CN: 若当前存在正在显示的工具栏 Fragment, 也同步更新它.
val supportManager = activity.supportFragmentManager
val fragment = supportManager.findFragmentById(R.id.toolbar_menu) as ToolbarFragment<*>?
if (fragment == null) {
mNormalToolbar.setMenuItemStatus(id, enabled)
} else {
fragment.setMenuItemStatus(id, enabled)
}
fragment?.setMenuItemStatus(id, enabled)
}
fun getMenuItemStatus(id: Int, defValue: Boolean): Boolean {
@@ -1231,6 +1234,17 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag
}
private fun initNormalToolbar() {
val fm = activity.supportFragmentManager
val existing = fm.findFragmentById(R.id.toolbar_menu)
// Always (re)bind listeners for both the cached normal toolbar and any restored fragment.
// This fixes the case where FragmentManager restores a ToolbarFragment instance after
// Activity recreation, but its listener fields are lost (null), causing "click does nothing".
//
// zh-CN:
// 总是为普通工具栏缓存对象与任何已恢复的 Fragment 重新绑定监听器.
// 这可以修复 Activity 重建后 FragmentManager 恢复出的 ToolbarFragment 实例其监听字段丢失 (null),
// 从而出现 "点击无反应" 的问题.
mNormalToolbar.apply {
setOnMenuItemClickListener(this@EditorView)
setOnMenuItemLongClickListener { id ->
@@ -1240,7 +1254,24 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag
}
}
}
activity.supportFragmentManager.findFragmentById(R.id.toolbar_menu) ?: showNormalToolbar()
(existing as? ToolbarFragment<*>)?.apply {
setOnMenuItemClickListener(this@EditorView)
setOnMenuItemLongClickListener { id ->
when (id) {
R.id.run if !mReadOnly -> true.also { debug() }
else -> false
}
}
// Sync menu state after rebinding to avoid stale enabled flags.
// zh-CN: 重新绑定后同步一次菜单状态, 避免 enabled 标记过期.
post { syncPrimaryMenuState() }
}
if (existing == null) {
showNormalToolbar()
}
}
private fun setUpFunctionsKeyboard() {
@@ -1933,6 +1964,7 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Observers.emptyConsumer()) { e: Throwable ->
e.printStackTrace()
showSnack(this, e.message, true)
showToast(context, e.message, true)
}
}
@@ -1945,6 +1977,10 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag
activity.supportFragmentManager.beginTransaction()
.replace(R.id.toolbar_menu, mNormalToolbar)
.commitAllowingStateLoss()
// Sync menu state after toolbar switch to avoid stale enabled flags.
// zh-CN: 切换工具栏后同步一次菜单状态, 避免 enabled 标记过期.
post { syncPrimaryMenuState() }
}
fun replace() {
@@ -2344,6 +2380,10 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag
arguments!!.putBoolean(SearchToolbarFragment.ARGUMENT_SHOW_REPLACE_ITEM, showReplaceItem)
})
.commit()
// Sync menu state after toolbar switch to avoid stale enabled flags.
// zh-CN: 切换工具栏后同步一次菜单状态, 避免 enabled 标记过期.
post { syncPrimaryMenuState() }
}
@Throws(CheckedPatternSyntaxException::class)
@@ -2360,6 +2400,10 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag
mInputMethodEnhanceBar.visibility = GONE
}
mDebugging = true
// Sync menu state after toolbar switch to avoid stale enabled flags.
// zh-CN: 切换工具栏后同步一次菜单状态, 避免 enabled 标记过期.
post { syncPrimaryMenuState() }
}
fun exitDebugging() {
@@ -2375,6 +2419,10 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag
mInputMethodEnhanceBar.visibility = VISIBLE
}
mDebugging = false
// Sync menu state after toolbar switch to avoid stale enabled flags.
// zh-CN: 切换工具栏后同步一次菜单状态, 避免 enabled 标记过期.
post { syncPrimaryMenuState() }
}
private fun showErrorMessage(msg: String) {