Android 跨越边界的重叠视图(假动作栏)
我正试图为Android2.1创建一个定制标题栏,该标题栏在某种程度上模仿Android3.0及更高版本中的ActionBar 到目前为止,我的运气还算不错,但我找不到一种简单的方法来制作可以显示在ActionBar图标/按钮下方的下拉列表 我希望这些下拉列表能够跨越标题布局和内容布局之间的边界,而不会被剪切/切断。我还希望下拉列表位于ActionBar中图标/按钮的相对下方。我已经看到了使用框架布局和RelativeLayouts的建议,但这些似乎并没有解决我的特定问题(除非我看错了)。我一直在想这一定是可能的,因为我相信新版Android支持这种行为 下面是我试图通过一些注释实现的屏幕截图。Android 跨越边界的重叠视图(假动作栏),android,view,android-actionbar,overlap,boundary,Android,View,Android Actionbar,Overlap,Boundary,我正试图为Android2.1创建一个定制标题栏,该标题栏在某种程度上模仿Android3.0及更高版本中的ActionBar 到目前为止,我的运气还算不错,但我找不到一种简单的方法来制作可以显示在ActionBar图标/按钮下方的下拉列表 我希望这些下拉列表能够跨越标题布局和内容布局之间的边界,而不会被剪切/切断。我还希望下拉列表位于ActionBar中图标/按钮的相对下方。我已经看到了使用框架布局和RelativeLayouts的建议,但这些似乎并没有解决我的特定问题(除非我看错了)。我一直
请帮忙。谢谢 你需要用一个标签来保存你的内容。FrameLayout可以容纳多个子项,并且允许它们相互重叠 可能的布局xml可能如下所示:
<FrameLayout>
<LinearLayout android:margin_top="30dip">...</LinearLayout>
<CustomActionBar />
</FrameLayout>
它将自定义操作栏替换为任何使用操作栏的xml布局的“根”元素。执行自定义操作栏时,需要从
FrameLayout
扩展它,并相应地指定子级的边距。这个想法和我上面介绍的想法非常相似 我认为最好的方法是创建一个线性布局,并将下拉列表项添加到该线性布局中。然后在按钮上单击添加线性布局,并使用相对布局参数将其显示在按钮下方。经过几天的研究,我发现实现这一点的最佳方法是使用自定义对话框和包含listView的自定义主题。当用户单击按钮时,对话框应直接显示在按钮下方。这提供了良好的用户体验,也意味着您不必完全更改基本布局结构来适应此功能。(这与ActionBar Sherlocke用于向后兼容菜单的方法基本相同)
下面是我所描述的代码片段(这是用C语言编写的,使用Mono for Android,但很容易翻译成Java):
Dialog dlgHome=new Dialog(这个,Resource.Style.ActionBarMenu);
dlgHome.SetCanceledOnTouchOutside(true);
SetContentView(Resource.Layout.ActionBarMenu);
ListView lsvHome=(ListView)dlgHome.FindViewById(Resource.Id.lsvHome);
lsvHome.Adapter=newArrayAdapter(这是Resource.Layout.ActionBarMenuItem,新字符串[]{“添加活动”、“编辑日志”、“程序详细信息”});
Rect r=新的Rect();
btnHome.GetLocalVisibleRect(r);
intx=r.Left+(int)TypedValue.ApplyDimension(ComplexUnitType.Dip,5,Resources.DisplayMetrics);
int y=右下角;
WindowManagerLayoutParams param=dlgHome.Window.Attributes;
参数Gravity=(int)(GravityFlags.Top | GravityFlags.Left);
参数X=X;
参数Y=Y;
dlgHome.Window.Attributes=param;
另外,这里是样式xml(位于style.xml中)
@颜色/操作栏\u菜单\u背景
符合事实的
错误的
这比我希望的更痛苦,但让它工作起来了。我想这不是很难,我只是希望布局xml能够更加紧凑和优雅。在机器人的限制下似乎不可能。谢谢。你可以让它更优雅。通过将“CustomActionBar”扩展为FrameLayout,请参见我编辑的答案。
<CustomActionBar>
<LinearLayout/>
</CustomActionBar>
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;
<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>