java - 如何获取android中弹出菜单的高度和宽度?

标签 java android android-menu dimensions popupmenu

我有一个弹出菜单,我只想获取它的尺寸以在我的 showCaseView 中用于我的导游。我无法在任何地方找到确定这些尺寸(高度和宽度)的方法。

private void initPopUpMenu() {
    PopupMenu popupMenu = new PopupMenu(TimelineActivity.this, menuIcon);
    popupMenu.getMenuInflater().inflate(R.menu.menu_timeline, popupMenu.getMenu());
}

如何从此结构中检索宽度和高度?这是一个包含 5 个项目的简单菜单资源

最佳答案

最好的解决方案是使用 ListPopupWindow 而不是具有 getWidth()getHeight()PopupMenu获得其尺寸的方法。然而,如果你真的想使用PopupMenu,可能比较棘手的方法是使用Reflection来访问其内部的ListView,因为没有方法可在 PopupMenu 中访问内容 View 。

用法:

PopupMenu popupMenu = initPopUpMenu();
popupMenu.show();

ListView listView = getPopupMenuListView(popupMenu);

androidx.core.view.ViewKt.doOnLayout(listView, view -> {
    System.out.println("PopupMenu Size: " + view.getWidth() + " x " + view.getHeight());
    return null;
});

方法:

private PopupMenu initPopUpMenu() {
    PopupMenu popupMenu = new PopupMenu(TimelineActivity.this, menuIcon);
    popupMenu.getMenuInflater().inflate(R.menu.menu_timeline, popupMenu.getMenu());
    return popupMenu;
}

private ListView getPopupMenuListView(PopupMenu popupMenu) {
    Method getMenuListViewMethod = null;
    try {
        getMenuListViewMethod = PopupMenu.class.getDeclaredMethod("getMenuListView");
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    }

    ListView listView = null;
    if (getMenuListViewMethod != null) {
        getMenuListViewMethod.setAccessible(true);
        try {
            listView = (ListView) getMenuListViewMethod.invoke(popupMenu);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
    return listView;
}

build.gradle:

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    implementation 'androidx.core:core-ktx:1.3.0'
}

结果:

I/System.out: PopupMenu Size: 539 x 660

关于java - 如何获取android中弹出菜单的高度和宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63770845/

相关文章:

java - 为什么我的程序会出现 "must be caught or declared to be thrown"?

android - Android 中的颜色替换器

java - 如何更改不同 fragment 中的选项菜单?

Android,用于导航的可重用工具栏 - 将代码放在哪里?

java - 如何随机设置按钮的位置?

java - HuffmanCode Java实例变量分配了一棵树,保持为空

Java - JCheckBox 针对列表进行过滤

android - 构建应用程序时出现 BufferOverflowException

android jetpack 导航仪器测试返回导航失败

android - fragment 中的 onCreateOptionsMenu() 不替换 ActionBar 菜单