动态查找MenuItem的位置

时间:2017-12-06 10:44:11

标签: java android

我有一个包含所有项目的菜单' showAsAction设置为ifRoom。现在我想得到任何这些菜单项中心的确切位置(x,y)。

我首先考虑从基础视图中获取此信息,但我不知道如何可靠地访问特定菜单项的视图。

onCreateOptionsMenu

MenuItem someItem = menu.findItem(R.id.some_action);
// someItem.getX();
// someItem.getY();

我希望这些坐标相对于应用程序Toolbar。在这种情况下,我还需要访问someItem.get{Width,Height}()来计算中心坐标。

示例菜单:

<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

<item
    android:id="@+id/action_search"
    android:title="@string/action_search"
    android:icon="@drawable/ic_search"
    app:actionViewClass="android.support.v7.widget.SearchView" 
    app:showAsAction="ifRoom|collapseActionView" />

<item
    android:id="@+id/action_example"
    android:title="@string/action_example"
    android:icon="@drawable/ic_example"
    app:showAsAction="ifRoom" />

</menu>

1 个答案:

答案 0 :(得分:2)

解决方案是使用基础活动来查找实例化视图。

View menuItemView = getActivity().findViewById(R.id.action_search);

然后可以使用View.getLocationInWindow(intArr)相对于工具栏提取位置,int[] itemWindowLocation = new int[2]; menuItemView.getLocationInWindow(itemWindowLocation); int[] toolbarWindowLocation = new int[2]; toolbar.getLocationInWindow(toolbarWindowLocation); int itemX = itemWindowLocation[0] - toolbarWindowLocation[0]; int itemY = itemWindowLocation[1] - toolbarWindowLocation[1]; int centerX = itemX + menuItemView.getWidth() / 2; int centerY = itemY + menuItemView.getHeight() / 2; 相对于视图的窗口返回(x,y)。

mNext.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(final View view) {
        showNextQuestion();
    }
});
mPrevious.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(final View view) {
        showPreviousQuestion();
    }
});

private void showNextQuestion() {
    showQuestion(1);
}

private void showPreviousQuestion() {
    showQuestion(-1);
}

private void showQuestion(int increment) {
    int newQuestionNumber = mQuestionNumber + increment;
    if (newQuestionNumber >= 0 && newQuestionNumber < mQuestionLibrary.getLength()) {
        mQuestionNumber = newQuestionNumber;
        mQuestionText.setText(mQuestionLibrary.getQuestion(mQuestionNumber));
    }
}