Android : Get view Reference to a Menu Item

前端 未结 6 697
醉酒成梦
醉酒成梦 2020-11-27 05:19

I plan to use quick actions UI pattern in my application. Android Quick Actions UI Pattern . The quick action window needs a pivot view to stick to.

    qui         


        
相关标签:
6条回答
  • 2020-11-27 05:35

    Inorder to get reference Views of menu items we need to do this,

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.section, menu);
    
        new Handler().post(new Runnable() {
            @Override
            public void run() {
    
                final View menuItemView = findViewById(R.id.action_preview);
                // SOME OF YOUR TASK AFTER GETTING VIEW REFERENCE
    
            }
        });
    
    
        return true;
    }
    
    0 讨论(0)
  • 2020-11-27 05:39

    Old question, but I ran into some issues with the actionViewClass attribute. For anyone who runs into this later...

    Calling findViewById(R.id.mnu_item) in onOptionsItemSelected will return a View anchor.

    QuickActions on the MenuItems aren't good design, but I found that they are the simplest way to implement submenus with custom backgrounds.

    0 讨论(0)
  • 2020-11-27 05:42

    Universal code which also works on Android 10

    /**
    * pass toolbar and menu item id, i.e. R.id.menu_refresh
    */
    @Nullable
    @Throws(
        IllegalAccessException::class,
        NoSuchFieldException::class
    )
    fun getMenuItemView(toolbar: Toolbar?, @IdRes menuItemId: Int): View? {
        val mMenuView: Field = Toolbar::class.java.getDeclaredField("mMenuView")
        mMenuView.setAccessible(true)
        val menuView: Any? = mMenuView.get(toolbar)
        (menuView as ViewGroup).children.forEach {
            if(it.id == menuItemId) {
                return it
            }
        }
        return null
    }
    
    0 讨论(0)
  • 2020-11-27 05:43

    in the main activity class, best to override the onOptionsItemSelected(...) method; should be something as below:

    public boolean onOptionsItemSelected(MenuItem item) {
      // the id is of type int
      int someId = item.getItemId();
      // can use an if() or switch() statement to check if id is selected
      //a Toast message can be used to show item is selected
    }
    
    0 讨论(0)
  • 2020-11-27 05:46

    An update for anyone that want to find the menu view item for other reasons (like I wanted).

    If you have access to and use AppCompat's Toolbar there is a way. It's not the most efficient way, but it's the easiest way I've found to access the menu item's view.

    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
    
        // Find Menu
        for (int toolbarChildIndex = 0; toolbarChildIndex < toolbar.getChildCount(); toolbarChildIndex++) {
            View view = toolbar.getChildAt(toolbarChildIndex);
    
            // Found Menu
            if (view instanceof ActionMenuView) {
                ActionMenuView menuView = (ActionMenuView) view;
    
                // All menu items
                for (int menuChildIndex = 0; menuChildIndex < menuView.getChildCount(); menuChildIndex++) {
                    ActionMenuItemView itemView = (ActionMenuItemView) menuView.getChildAt(menuChildIndex);
                    // Do something to itemView...
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-27 05:52

    You can achieve this by providing your menu item with an actionViewClass property in xml and then you will be able to get the pivot view u wanted. The code would be something like this

    <item
        android:id="@+id/menu_find"
        android:showAsAction="ifRoom"
        android:actionViewClass="android.widget.ImageButton"
        />
    

    In your OnCreateOptionsMenu do this

    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.menu_search, menu);
        locButton = (ImageButton) menu.findItem(R.id.menu_find).getActionView();
        locButton.setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                createPopup();
                mQuickAction.show(v);
            }
        });
        return true;
    }
    
    0 讨论(0)
提交回复
热议问题