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

时间:2011-12-23 09:30:14

标签: android view menu menuitem quickaction

我打算在我的应用程序中使用快速操作UI模式。 Android Quick Actions UI Pattern。快速操作窗口需要一个枢轴视图才能坚持下去。

    quickAction.show(View pivotView);

我打算对菜单项使用快速操作,我可以访问被点击的项目。 但问题是我需要从菜单项引用一个视图,以便我可以将它传递给快速操作。

如何在所选的menuItem中引用视图。

9 个答案:

答案 0 :(得分:90)

您可以通过在xml中为菜单项提供actionViewClass属性来实现此目的,然后您就可以获得所需的数据透视视图。代码就是这样的

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

在OnCreateOptionsMenu中执行此操作

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

答案 1 :(得分:36)

旧问题,但我遇到了actionViewClass属性的一些问题。对于后来碰到这个的人......

findViewById(R.id.mnu_item)中拨打onOptionsItemSelected将返回View个锚点。

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

答案 2 :(得分:5)

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

/models

答案 3 :(得分:3)

任何想要根据其他原因查找菜单视图项目的人的更新(例如我想要的)。

如果您可以访问和使用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...
            }
        }
    }
}

答案 4 :(得分:0)

在主活动类中,最好覆盖onOptionsItemSelected(...)方法;应该是如下:

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
}

答案 5 :(得分:0)

您可以像这样获得对菜单项的引用:

long_entry  long_exit   open_long   close_long   long
0   False   False       0           0            0
1   True    False       1           0            1
2   False   False       0           0            1
3   False   True        0          -1            0

然后用它做任何你想做的事。例如。像这样改变它的图标:

MenuItem btnFavorites = menu.findItem(R.id.action_favorite);

答案 6 :(得分:0)

通用代码也可在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
}

答案 7 :(得分:0)

科特琳!

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

答案 8 :(得分:-1)

在onOptionsItemSelected内部,只需使用id。

即可获取视图

查看menuItemView = findViewById(R.id.action_sort);

现在您可以根据您的要求使用此视图。