【问题标题】:Overlapping views crossing boundaries (Fake actionbar)跨越边界的重叠视图(假操作栏)
【发布时间】:2012-04-29 09:54:21
【问题描述】:

我正在尝试为 Android 2.1 创建一个自定义标题栏,在某种程度上模拟 Android 3.0 及更高版本中的 ActionBar。

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

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

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

请帮忙。谢谢!!!

【问题讨论】:

    标签: android view android-actionbar overlap boundary


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      附言。我不确定 FrameLayout 是先渲染还是最后渲染第一个孩子。如果您发现线性布局的内容与 customactionbar 重叠,请交换它们的位置。

      === 编辑 ===

      为了使代码更简洁,可以这样做:

      <CustomActionBar>
          <LinearLayout/>
      </CustomActionBar>
      

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

      【讨论】:

      • 这比我想要的更痛苦,但让它起作用了。我想不是很困难我只是希望布局 xml 可以更紧凑和优雅。 androids 的限制似乎是不可能的。谢谢。
      • 你可以让它更优雅。通过将您的“CustomActionBar”扩展为 FrameLayout,请参阅我编辑的答案。
      【解决方案3】:

      经过几天的研究,我发现实现此功能的最佳方法是使用带有自定义主题的自定义对话框,其中包含 listView。当用户单击按钮时,对话框应直接显示在按钮下方。这提供了良好的用户体验,也意味着您不必完全改变您的基本布局结构来适应此功能。 (这与 ActionBar Sherlocke 用于向后兼容菜单的方法基本相同)

      这是我所描述的代码 sn-p(这是使用 Android 的 Mono 用 C# 编写的,但应该很容易翻译成 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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-16
        • 1970-01-01
        • 1970-01-01
        • 2018-09-11
        • 1970-01-01
        相关资源
        最近更新 更多