经过几天的研究,我发现实现这一点的最佳方法是使用带有自定义主题的自定义对话框,其中包含 listView。当用户单击按钮时,对话框应直接显示在按钮下方。这提供了良好的用户体验,也意味着您不必完全改变您的基本布局结构来适应此功能。(这与 ActionBar Sherlocke 用于向后兼容菜单的方法基本相同)
这是我正在描述的代码片段(这是用 C# 编写的,使用 Mono for Android,但应该很容易翻译成 Java):
Dialog dlgHome = new Dialog(this, Resource.Style.ActionBarMenu);
dlgHome.SetCanceledOnTouchOutside(true);
dlgHome.SetContentView(Resource.Layout.ActionBarMenu);
ListView lsvHome = (ListView)dlgHome.FindViewById(Resource.Id.lsvHome);
lsvHome.Adapter = new ArrayAdapter<string>(this, Resource.Layout.ActionBarMenuItem, new string[] { "Add Activity", "Edit Log", "Program Details" });
Rect r = new Rect();
btnHome.GetLocalVisibleRect(r);
int x = r.Left + (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, 5, Resources.DisplayMetrics);
int y = r.Bottom;
WindowManagerLayoutParams param = dlgHome.Window.Attributes;
param.Gravity = (int)(GravityFlags.Top | GravityFlags.Left);
param.X = x;
param.Y = y;
dlgHome.Window.Attributes = param;
此外,这里是样式 xml(在 style.xml 中)
<style name="ActionBarMenu" parent="android:Theme.Dialog">
<item name="android:windowBackground">@color/actionbar_menu_bg</item>
<item name="android:windowNoTitle">true</item>
<item name="android:backgroundDimEnabled">false</item>
</style>