Ничего не происходит при щелчке по пункту меню параметров панели инструментов при первом запуске приложения - PullRequest
0 голосов
/ 24 сентября 2019

Я использую фрагменты 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();
    }
...