@@ -157,14 +157,12 @@ class ActionPage : AppCompatActivity() {
157157 menuOptions = PageMenuLoader (applicationContext, config).load()
158158 }
159159
160- // Xóa sạch menu cũ nếu có để tránh trùng lặp khi invalidateOptionsMenu() được gọi
161160 menu?.clear()
162161
163162 menuOptions?.forEachIndexed { index, option ->
164163 if (option.isFab) {
165164 addFab(option)
166165 } else {
167- // SỬA: Gán chính xác Menu.NONE cho groupId, index cho itemId và order
168166 val menuItem = menu?.add(Menu .NONE , index, index, option.title)
169167 if (option.type == " checkbox" ) {
170168 menuItem?.isCheckable = true
@@ -175,7 +173,6 @@ class ActionPage : AppCompatActivity() {
175173 }
176174
177175 override fun onPrepareOptionsMenu (menu : Menu ): Boolean {
178- // Cập nhật giao diện tích (isChecked) trước khi Menu hiển thị ra cho người dùng
179176 menuOptions?.forEachIndexed { index, option ->
180177 if (! option.isFab && option.type == " checkbox" ) {
181178 val menuItem = menu.findItem(index)
@@ -186,25 +183,34 @@ class ActionPage : AppCompatActivity() {
186183 return super .onPrepareOptionsMenu(menu)
187184 }
188185
186+ // SỬA LỖI LOẠN VỊ TRÍ: Ánh xạ chính xác bằng originalIndex gốc của mảng menuOptions
189187 private fun refreshCheckboxMenuStates () {
190188 val config = currentPageConfig ? : return
191- val checkboxOptions = menuOptions?.filter { it.type == " checkbox" && it.checkedSh.isNotEmpty() }
192- if (checkboxOptions.isNullOrEmpty() || menuCheckboxRefreshing) return
189+
190+ // Tạo một danh sách Pair chứa cặp (Vị trí gốc trong menuOptions, Đối tượng Option)
191+ val checkboxOptionsWithIndex = menuOptions?.mapIndexed { index, option -> index to option }
192+ ?.filter { (_, option) -> option.type == " checkbox" && option.checkedSh.isNotEmpty() }
193+
194+ if (checkboxOptionsWithIndex.isNullOrEmpty() || menuCheckboxRefreshing) return
193195 menuCheckboxRefreshing = true
194196
195197 lifecycleScope.launch(Dispatchers .IO ) {
196- val results = checkboxOptions.map { option ->
197- option to ScriptEnvironmen .executeResultRoot(this @ActionPage, option.checkedSh, config)?.trim()
198+ // Thực thi script và giữ nguyên vị trí index gốc ban đầu
199+ val results = checkboxOptionsWithIndex.map { (originalIndex, option) ->
200+ val result = ScriptEnvironmen .executeResultRoot(this @ActionPage, option.checkedSh, config)?.trim()
201+ Triple (originalIndex, option, result)
198202 }
199203
200204 withContext(Dispatchers .Main ) {
201205 menuCheckboxRefreshing = false
202206 var changed = false
203- results.forEach { (option, result) ->
207+
208+ results.forEach { (originalIndex, option, result) ->
204209 val newChecked = result == " 1" || result?.lowercase() == " true"
205210 if (option.checked != newChecked) changed = true
206211 option.checked = newChecked
207212 }
213+
208214 if (changed && ! isFinishing) {
209215 invalidateOptionsMenu()
210216 }
@@ -226,13 +232,11 @@ class ActionPage : AppCompatActivity() {
226232
227233 override fun onOptionsItemSelected (item : MenuItem ): Boolean {
228234 val options = menuOptions ? : return false
229- val index = item.itemId // itemId bây giờ lưu chính xác vị trí index của mảng
235+ val index = item.itemId
230236
231- // SỬA: Đảm bảo kiểm tra index hợp lệ trong phạm vi của mảng options
232237 if (index in options.indices) {
233238 val option = options[index]
234239
235- // Nếu là Checkbox, đảo trạng thái ngay lập tức trên UI để người dùng thấy mượt mà
236240 if (option.type == " checkbox" ) {
237241 option.checked = ! option.checked
238242 item.isChecked = option.checked
0 commit comments