Я использую фрагменты AndroidX и привязку данных, и я столкнулся со странным поведением при вызове setOnMenuItemClickListener
на собственной панели инструментов моего фрагмента: как видно из названия этого вопроса, при первом запуске приложения ничего не происходит, если я пытаюсь нажатьна определенный элемент (R.id.menu_switch_view
) в меню параметров моей панели инструментов.Но когда я перехожу на другой экран и возвращаюсь к моему предыдущему фрагменту с меню параметров, выбор R.id.menu_switch_view
теперь работает, как и ожидалось.
Logcat показывает следующее сообщение:
W/InputEventReceiver: Attempted to finish an input event but the input event receiver has already been disposed.
W/InputMethodManagerService: Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@2460fc06 attribute=null, token = android.os.BinderProxy@37cc1ba9
Воткак я создал это поведение, очистите все последние приложения, перезагрузите устройство и запустите приложение.Как только появится панель инструментов, щелкните меню параметров и выберите «Переключить представление» / R.id.menu_switch_view
.
Я проверил, что это происходит на моем устройстве Android API 22, но такое поведение не происходит на другом API27 устройство.Вот мой код:
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = FragmentFavoritesBinding.inflate(inflater, container, false);
requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(),
new OnBackPressedCallback(true) {
@Override
public void handleOnBackPressed() {
// do nothing on back press
}
});
binding.button.setOnClickListener((v ->
navController.navigate(R.id.action_favorites_dest_to_app_list_dest)));
binding.toolbar.inflateMenu(R.menu.menu_add_apps);
int spanCount = preferenceRepository.get(R.string.key_span_count, 1);
layoutManager = new GridLayoutManager(requireContext(), spanCount);
binding.rvNav.setLayoutManager(layoutManager);
faveListAdapter = new FaveListAdapter(this::launchApp, layoutManager);
binding.rvNav.setAdapter(faveListAdapter);
faveListAdapter.setAppList(faveList);
faveListAdapter.setOnDeleteItemListener(list -> {
faveList = list;
viewModel.saveFaveApps(faveList).observe(getViewLifecycleOwner(), this::handleSaveStatus);
updateRecyclerView();
});
viewModel.loadFaveAppList().observe(getViewLifecycleOwner(), list -> {
faveList = list;
faveListAdapter.swapItems(list);
updateRecyclerView();
});
binding.toolbar.setOnMenuItemClickListener(item -> {
switch (item.getItemId()) {
case R.id.menu_disp_add_apps:
navController.navigate(R.id.action_favorites_dest_to_app_list_dest);
return true;
case R.id.menu_switch_view:
if(layoutManager.getSpanCount() == 1) {
layoutManager.setSpanCount(3);
} else {
layoutManager.setSpanCount(1);
}
Log.d(TAG, "onCreateView: " + faveListAdapter.getItemCount());
faveListAdapter.notifyItemRangeChanged(0, (faveListAdapter != null ? faveListAdapter.getItemCount() : 0));
return true;
default:
break;
}
return super.onOptionsItemSelected(item);
});
return binding.getRoot();
}