弹出菜单超出屏幕

9

在这个活动中,弹出菜单在充气时超出了屏幕,在其他活动中正常工作。

enter image description here

扩展自定义的AppCompatActivity

样式:

<style name="AppTheme.ActionBar.TransparentContextTranscition" parent="AppTheme.NoActionBar">
    <item name="android:windowActivityTransitions">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowContentTransitions">true</item>
    <item name="android:windowLightStatusBar">true</item>

    <item name="android:itemBackground">@android:color/white</item>
    <item name="android:textColor">@android:color/black</item>
    <item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
    <item name="android:popupMenuStyle">@style/PopupMenu</item>
</style>

<style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
    <item name="color">@android:color/white</item>
</style>

<style name="PopupMenu" parent="@android:style/Widget.PopupMenu">
    <item name="android:popupBackground">@android:color/white</item>
</style>

Java 代码

holder.contextMenuView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final PopupMenu popup = new PopupMenu(v.getContext(), v);
            popup.inflate(R.menu.song_item_menu_album_inner_layout);
        }
});

工具栏填充菜单运作良好

enter image description here


你使用过锚点吗?同时展示Java代码。 - Sohail Zahid
更新了 @SohailZahid - Saiteja Prasadam
1
可能听起来有点傻,但今天早些时候我在模拟器上遇到了这个问题,后来我尝试在我的设备上运行它,结果它正常工作了。进行了一次清理和重建,问题得到了解决。 - ziondreamt
好的,那就回答你自己的问题并打勾标记。 - Sohail Zahid
清理了项目并重新构建,仍然无法工作... @ziondreamt - Saiteja Prasadam
显示剩余7条评论
5个回答

13

看起来我使用了

getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,      WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

这是我的失误。FLAG_LAYOUT_NO_LIMITS会为上下文菜单删除限制。(这就是上下文菜单超出屏幕的原因)希望对有需要的人有所帮助。


如何在弹出菜单中使用FLAG_LAYOUT_NO_LIMITS?有什么解决方案吗? - mostafa hashim
抱歉回复晚了,我没有找到解决方案。所以我移除了FLAG_LAYOUT_NO_LIMITS。抱歉回复晚了,希望能对某人有所帮助。 - Saiteja Prasadam

8
在您的代码中使用以下内容:
final PopupMenu popup = new PopupMenu(v.getContext(), v, Gravity.RIGHT);

如果不起作用,则更改锚视图v。因为它可以根据您的要求设置弹出菜单的位置。


1
一个简单但可定制的Android下拉菜单。它支持带/不带图标的文本、分隔符,甚至是完全自定义的视图。

https://github.com/shehabic/Droppy


0

很不幸,弹出菜单不会根据所在视图的大小进行调整,而是超出范围。我以前也遇到过同样的问题。虽然我知道这不是最好的解决方案,但还是试一试:

创建一个透明的假视图,用作锚点来阻止边缘超出。

然而,由于它将是浮动的,所以不能放置在顶部或底部,因此在尝试时要注意高度超出的问题。

另外,千万别忘记设置android:anyDensity="True/False"


我该如何实现它,你能给我提供一些步骤吗? - Saiteja Prasadam
我没有你的完整布局,所以不知道你的LinearLayouts和Floating items等如何定位。但是我可以解释主要思路,之后你就会明白了。问题在于弹出窗口不遵守边缘,因此你必须将其替换到外观看起来正常的地方,对吧?你把弹出窗口留在那里,但是你将其填充到另一个视图中,这个视图是虚假的并且位于/浮动在左侧一点。因此,当弹出菜单在其中填充时,它将完美地显示在正确的位置。你欺骗了设计的外观。祝好运! - koksalb
我再次强调,这绝对不是最好的解决方案,听起来你放弃了自己的编码才能并试图作弊。但这不就是全部吗?找到一个简单的方法来正确地完成某件事情。如果有人在帖子中提出了与代码相关的解决方案,那么我也可以学习并修复我的旧应用程序。 - koksalb
它可能无法在大型设备或不同的SDK上完美运行(如果我错了请纠正我)。 - Saiteja Prasadam
这并不是最好的解决方案,我已经说过了。但是使用这个想法,一切都取决于你的设计。你可以放置一个看起来像弹出菜单的布局,并在其中放置固定大小的选项,同时在其中放置一个滚动视图,即使有100个选项也很有用。 - koksalb
那不会是最优解决方案,感谢您的建议...也许我会用对话框来实现它。 - Saiteja Prasadam

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接