将视图放置/重叠(z-index)在操作栏选项卡上方

9

我有一个View,它在包含它的Fragment之外绘制某些内容,并使用这个配置来绘制超出范围的内容。

问题在于,它可以在任何地方工作,但无法在ActionBar和ActionBar标签上运行。

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

我正在使用appCompat并添加选项卡,方法如下:
我将android:clipChildren="false"添加到所有父视图中,但它仅适用于ActionBar和ActionBar选项卡。
期望的视图如下: enter image description here 但结果是这样的: enter image description here

首先尝试创建和填充自定义视图,然后是选项卡。 - Jemshit Iskenderov
3个回答

2
没有完整的源代码,帮助你并不容易;但是我可以建议一种适合你情况的替代方法。
如果你正在创建一个自定义浮动项(可能用于教程或提示),你应该避免更改基础视图层次结构,而是选择纯覆盖层解决方案PopupWindow正是你需要的:

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

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

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

你可以在这里找到一个简单的例子。

这个视图在onDraw()方法中绘制圆形,这是一个复杂的视图,因此我不想改变视图功能。 - Morteza Rastgoo
你坚持避免更改基本层次结构,但是你将外来视图附加到根窗口。此外,弹出窗口将一直保留在该容器中,直到明确删除为止。 - bugraoral
@wrecker 是的,因为它实际上是一个重叠和独特的视图,与普通的树形布局无关。你的解决方案很糟糕,因为你改变了层次结构以实现临时的视觉效果(而且你仍然需要删除圆角视图并重新计算布局)。对于这种用例,弹出窗口更好。 - bonnyz
我同意这些答案都不好,因为这个视图需要在活动的布局中。至少我承认我的答案不是处理这个问题的方式,但至少我将一个级别从视图层次结构中删除。 - bugraoral

0
这是因为您的活动布局的层次结构顺序问题。您的ActionBar被绘制在您的View上方。您可以找到您活动的框架并在那里添加视图。
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实现这些功能要简单得多。


0

我最终移除了 tabBar 并用简单的按钮替换它,以在 CustomLayout 之前放置它以便在 xml 中绘制。

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

<CustomLayout

....
/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接