【问题标题】:Placing/Overlapping (z-index) a view above actionbar tabs在操作栏选项卡上方放置/重叠(z-index)视图
【发布时间】:2015-12-20 12:11:55
【问题描述】:

我有一个视图,它在包含它的 Fragment 之外绘制一些东西,我将它配置为 draw the content outside it using this

问题是它可以在任何地方工作,但在 ActionBar 和 ActionBar 选项卡上。

mActionBar.addTab(
    mActionBar.newTab()
        .setCustomView(t));

我正在使用 appCompat 并以这种方式添加标签:

我将android:clipChildren="false" 添加到所有父视图中,但它不适用于 ActionBar 和 ActionBar 选项卡。

想要的视图:

但结果是这样的:

【问题讨论】:

  • 尝试先创建和扩展自定义视图,然后是标签

标签: android canvas view android-actionbar z-index


【解决方案1】:

没有完整的源代码,帮助你并不容易;无论如何,我可以向您建议一种可能适合您情况的替代方法。

如果您正在创建自定义浮动项(可能用于教程或提示),您应该避免更改基本视图层次结构并更喜欢纯覆盖解决方案

PopupWindow 正是您所需要的:

可用于显示任意视图的弹出窗口。

由于PopupWindow 作用于Activity 级别,它应该覆盖当前Activity 中的所有内容

弹出窗口是一个浮动容器,出现在 当前活动。

你可以找到一个简单的例子here

【讨论】:

  • 这个视图在 onDraw() 方法中画圆,这是一个复杂的视图,所以我不想改变视图功能。
  • 您坚持要避免更改基本层次结构,但您正在将外星视图附加到根窗口。此外,弹出窗口将保留在该容器中,直到它被明确删除。
  • @wrecker 是的,因为它实际上是一个与普通树布局无关的重叠和奇特的视图。您的解决方案很糟糕,因为您正在更改层次结构以实现临时的视觉效果(并且您仍然必须删除圆形视图并重新计算布局)。对于这个用例,弹出窗口更好
  • 我可以同意这些答案都不好,因为这个视图需要在活动的布局中。至少我接受我的答案不是应该处理的方式,但至少我在视图层次结构之外绘制了一个更少的级别。
【解决方案2】:

我终于把tabBar去掉了,换成简单的按钮来切换tab,放在xml中CustomLayout之前要绘制在它之前。

<LinearLayout
    ....
    // tabs layout />

<CustomLayout

....
/>

【讨论】:

    【解决方案3】:

    这是因为您的活动布局的层次顺序。您的 ActionBar 正在您的视图上绘制。您可以找到您的活动框架并在那里添加视图。

    private void addCircleView() {
        final FrameLayout frameLayoutRoot = (FrameLayout) getActivity().getWindow()
            .getDecorView().findViewById(android.R.id.content);
    
        View circleView = inflater.inflate(
            R.layout.my_circle_view, frameLayoutRoot, false);
    
        ViewGroup.MarginLayoutParams marginLayoutParams =
            ((ViewGroup.MarginLayoutParams) circleView.getLayoutParams());
    
        marginLayoutParams.topMargin = getStatusBarHeight(getActivity()) 
            + getActivity().getActionBar().getHeight()
            + getResources().getDimensionPixelSize(R.dimen.your_margin_top_circle);
    
        circleView.setLayoutParams(marginLayoutParams);
    
        frameLayoutRoot.addView(circleView);
    }
    
    public int getStatusBarHeight(Context context) {
    
        int result = 0;
    
        final int resourceId = context.getResources().getIdentifier(
            "status_bar_height", "dimen", "android");
    
        if (resourceId > 0) {
            result = context.getResources().getDimensionPixelSize(resourceId);
        }
        return result;
    }
    

    还记得在导航到其他片段时删除视图。

    frameLayoutRoot.removeView(circleView);
    

    编辑:

    请注意,您应该在添加ActionBar 的级别上执行此操作,即活动。在这种情况下,您将不需要这些解决方法。使用ToolBar 更容易实现这些东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多