跨越边界的重叠视图(假动作栏)

时间:2012-04-18 01:53:28

标签: android view android-actionbar overlap boundary

我正在尝试为Android 2.1创建一个自定义标题栏,它有点模仿Android 3.0及更高版本中的ActionBar。

到目前为止,我的运气还算不错,但我找不到一个简单的方法来制作可以出现在ActionBar图标/按钮下方的下拉列表。

我希望这些下拉列表能够跨越标题布局和内容布局之间的边界,而不会被剪切/剪切。我还希望下拉列表位于ActionBar中图标/按钮的相对位置。我已经看到了使用FrameLayouts和RelativeLayouts的建议,但这些似乎并没有解决我的特殊问题(除非我看错了)。我一直认为它必须是可能的,因为我相信Android的新版本支持这种类型的行为。

以下是我试图用一些笔记完成的截图。 http://img217.imageshack.us/img217/3279/67343249.png

请帮忙。感谢!!!

3 个答案:

答案 0 :(得分:0)

您需要使用FrameLayout保留您的内容。 FrameLayout可以容纳多个子节点,并允许它们相互重叠。

可能的布局xml可能如下所示:

<FrameLayout>
    <LinearLayout android:margin_top="30dip">...</LinearLayout>
    <CustomActionBar />
</FrameLayout>

30dip只是ActionBar的高度,您可能希望在values中定义它。 LienarLayout可以替换为仅用于保存应用程序中其他内容的任何内容。

PS。我不确定FrameLayout是第一个还是最后一个孩子。如果您发现线性布局的东西与习惯栏重叠,请交换它们的位置。

===编辑===

为了使代码更清晰,可以这样做:

<CustomActionBar>
    <LinearLayout/>
</CustomActionBar>

将自定义操作栏替换为使用操作栏的任何xml布局的“根”元素。在执行自定义操作栏时,您需要从FrameLayout扩展它,并相应地分配子项的边距。这个想法与我上面提到的想法非常相似。

答案 1 :(得分:0)

我认为最好的方法是创建线性布局并将下拉列表项添加到该线性布局中。然后在按钮单击时添加线性布局,并使用相对布局布局框架将其显示在按钮下方。

答案 2 :(得分:0)

经过几天的研究,我发现实现这一点的最佳方法是使用一个自定义对话框,其中包含一个包含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>