Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 跨越边界的重叠视图(假动作栏)_Android_View_Android Actionbar_Overlap_Boundary - Fatal编程技术网

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

Android 跨越边界的重叠视图(假动作栏),android,view,android-actionbar,overlap,boundary,Android,View,Android Actionbar,Overlap,Boundary,我正试图为Android2.1创建一个定制标题栏,该标题栏在某种程度上模仿Android3.0及更高版本中的ActionBar 到目前为止,我的运气还算不错,但我找不到一种简单的方法来制作可以显示在ActionBar图标/按钮下方的下拉列表 我希望这些下拉列表能够跨越标题布局和内容布局之间的边界,而不会被剪切/切断。我还希望下拉列表位于ActionBar中图标/按钮的相对下方。我已经看到了使用框架布局和RelativeLayouts的建议,但这些似乎并没有解决我的特定问题(除非我看错了)。我一直

我正试图为Android2.1创建一个定制标题栏,该标题栏在某种程度上模仿Android3.0及更高版本中的ActionBar

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

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

下面是我试图通过一些注释实现的屏幕截图。


请帮忙。谢谢

你需要用一个标签来保存你的内容。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>