Android:获取菜单项的视图引用

Android:获取菜单项的视图引用,android,view,menu,menuitem,quickaction,Android,View,Menu,Menuitem,Quickaction,我计划在我的应用程序中使用快速操作UI模式。“快速操作”窗口需要一个轴视图才能固定 quickAction.show(View pivotView); 我打算对菜单项使用快速操作,我可以访问单击的项。 但问题是我需要引用菜单项中的视图,以便将其传递给快速操作 如何获取对所选菜单项中视图的引用。您可以通过为菜单项提供xml格式的actionViewClass属性来实现这一点,然后您将能够获取所需的透视视图。代码应该是这样的 <item android:id="@+id/me

我计划在我的应用程序中使用快速操作UI模式。“快速操作”窗口需要一个轴视图才能固定

    quickAction.show(View pivotView);
我打算对菜单项使用快速操作,我可以访问单击的项。 但问题是我需要引用菜单项中的视图,以便将其传递给快速操作


如何获取对所选菜单项中视图的引用。

您可以通过为菜单项提供xml格式的actionViewClass属性来实现这一点,然后您将能够获取所需的透视视图。代码应该是这样的

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


老问题,但我在
actionViewClass
属性中遇到了一些问题。对于以后遇到这种情况的人

调用
onOptionsItemSelected
中的
findViewById(R.id.mnu\u项)
将返回
视图
锚定

MenuItems
上的
QuickActions
不是很好的设计,但我发现它们是实现具有自定义背景的子菜单的最简单方法。

对于出于其他原因(如我所希望的)想要查找菜单视图项的任何人来说,这是一个更新

如果您可以访问并使用AppCompat的工具栏,有一种方法。这不是最有效的方式,但却是我发现的访问菜单项视图的最简单方式

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...
            }
        }
    }
}
public void onViewCreated(视图,@Nullable Bundle savedInstanceState){
Toolbar-Toolbar=(Toolbar)view.findviewbyd(R.id.Toolbar);
//查找菜单
对于(int-toolbarChildIndex=0;toolbarChildIndex
在主活动类中,最好重写onoptionItemSelected(…)方法;应该是以下内容:

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
}

为了获取菜单项的参考视图我们需要这样做

@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;
}

同样适用于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
}
科特林

override fun onCreateOptionsMenu(Menu menu): Boolean {

  /*Adding menu items to action bar*/
  menuInflater.inflate(R.menu.main, menu)

  /*Getting menu item*/
  val locButton: MenuItem = menu.findItem(R.id.menu_find)

  /*Creating click listener*/
  locButton.setOnMenuItemClickListener{
    /*TODO: Handle it*/
    true
  }

  return true;
}

你用过这个链接吗?@nikhilleddygujjula链接不起作用。很久以前我就试过了,但是我没有代码。非常感谢!我遇到了一个奇怪的问题,在android 4.1上,取景器会在actionbar中找到一个spiner,但在4.2上它只是返回null,这个问题已经解决了。setOnMenuItemClickListener将对我很有帮助,如果你想直接使用菜单项use app:actionViewClass执行操作,如果你使用最近的库。(res auto)我想在获取“menuItem”“view”锚之前,您至少需要单击“menuItem”一次。没错,
findViewById()
调用必须在运行时完成。如果我们放置actionViewClass,Thank@ASH answer失败。这很好用。最好的方法是,不创建任何自定义视图和setactionviewIt很难看(感谢api),但这是真正可行的解决方案,非常感谢
override fun onCreateOptionsMenu(Menu menu): Boolean {

  /*Adding menu items to action bar*/
  menuInflater.inflate(R.menu.main, menu)

  /*Getting menu item*/
  val locButton: MenuItem = menu.findItem(R.id.menu_find)

  /*Creating click listener*/
  locButton.setOnMenuItemClickListener{
    /*TODO: Handle it*/
    true
  }

  return true;
}