簡體   English   中英

通過不同的片段復制菜單項

[英]Duplicating menu items via different Fragments

After OnCreateOptionsMenu() marked as deprecated, I've managed to use new API from release notes https://developer.android.com/jetpack/androidx/releases/activity#1.4.0-alpha01 In my app user can switch Fragments via底部導航。 據我了解文檔,在每個片段中我都實現了 MenuProvider(有或沒有生命周期,對結果無關緊要)。 但是現在在每個 Fragment 用戶中都有來自所有 menuInflaters 的所有項目。 有實現代碼

片段A

@Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        SetMainParams();
        fragment = inflater.inflate( R.layout.fragment_A, container, false );

        addMenu();

        return fragment;
    }

    private void addMenu()
    {
        MenuProvider menuProvider = new MenuProvider()
        {
            @Override
            public void onCreateMenu(@NonNull Menu menu, @NonNull MenuInflater menuInflater)
            {
                menuInflater.inflate(R.menu.menu_fragment_A, menu);
            }

            @Override
            public boolean onMenuItemSelected(@NonNull MenuItem menuItem)
            {
                if( menuItem.getItemId() == R.id.filters_prev )
                    filtersPrevious();
                else if( menuItem.getItemId() == R.id.filters )
                    showFilters();
                else
                    filtersNext();

                return false;
            }
        };

        requireActivity().addMenuProvider(menuProvider, getViewLifecycleOwner(), Lifecycle.State.RESUMED);
    }

片段 B

@Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        SetMainParams();
        binding = FragmentBBinding.inflate(inflater, container, false);
        fragment = binding.getRoot();
        init();

        addMenu();

        return fragment;
    }

    private void addMenu()
    {
        MenuProvider menuProvider = new MenuProvider()
        {
            @Override
            public void onCreateMenu(@NonNull Menu menu, @NonNull MenuInflater menuInflater)
            {
                menuInflater.inflate(R.menu.menu_fragment_B, menu);
                filtersMenu = menu.getItem(0);
            }

            @Override
            public boolean onMenuItemSelected(@NonNull MenuItem menuItem)
            {
                if( menuItem.getItemId() == R.id.filters )
                    loadFilters();

                return false;
            }
        };

        requireActivity().addMenuProvider(menuProvider, getViewLifecycleOwner(), Lifecycle.State.RESUMED);
    }

從底部導航切換

binding.bottomNav.setOnItemSelectedListener(item ->
        {
            int itemId = item.getItemId();

            if( itemId == R.id.A )
            {
                fm.beginTransaction().hide(active_fragment).show(A_fragment).commit();
                active_fragment = A_fragment;
                setWithElevation(false);
            }
            else if( itemId == R.id.B )
            {
                fm.beginTransaction().hide(active_fragment).show(B_fragment).commit();
                active_fragment = B_fragment;
                setWithElevation(true);
            }

            active_fragment.startFragment();
            active_fragment.setTitle();
            return true;
        });

        fm.beginTransaction().add( R.id.fl_content, A_fragment, "A_fragment" ).hide(A_fragment).commit();
        fm.beginTransaction().add( R.id.fl_content, B_fragment, "B_fragment" ).hide(B_fragment).commit();

有什么想法,為什么新的 API 像這樣工作,或者我犯了一個錯誤。 非常感謝您的幫助:)

我今天也遇到了這個問題。 所以不確定你是否有智能感知,但看看一些Menu接口方法。 我在 Kotlin 中使用了hasVisibleItems()方法,僅在菜單不存在時才對其進行膨脹。 Java也有方法; 你的片段增加了條件:

MenuProvider menuProvider = new MenuProvider()
    {
         @Override
         public void onCreateMenu(@NonNull Menu menu, @NonNull MenuInflater menuInflater)
         {
             if (!menu.hasVisibleItem()) {  // only inflate if no items
                 menuInflater.inflate(R.menu.menu_fragment_A, menu);
             }
         }        
//...

Menu還有許多其他方法可以幫助特定項目。
另一個好主意是使用MenuHost接口來跟蹤您的MenuProvider 我相信Java; 在你的 Fragments 里面; 這將是:

activityFragment = this.requireActivity();
Menuhost menuHost = (MenuHost) activityFragment;
menuHost.addMenuProvider(
    menuProvider,
    this.getViewLifecycleOwner(),
   State.RESUMED
);

然后可以使菜單提供程序無效等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM