Размещение / Перекрытие (z-index) над вкладками панели действий

У меня есть представление, которое рисует что-то вне Фрагмента, содержащего его, и я настроил его для рисования содержимого вне его, используя это .

Проблема в том, что он работает повсеместно, но на вкладках ActionBar и ActionBar.

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

Я использую appCompat и добавление вкладок следующим образом:

Я добавил android:clipChildren="false" ко всем родительским представлениям, но он не работает только для вкладок ActionBar и ActionBar.

Желаемый вид:

Введите описание изображения здесь Но в результате получается следующее:

Введите описание изображения здесь

Нелегко помочь вам без полного исходного кода; Во всяком случае, я могу предложить вам альтернативный подход, который может удовлетворить ваше дело.

Если вы создаете настраиваемый плавающий элемент (может быть, используется для учебника или подсказки), вам следует избегать изменения иерархии базовых представлений и предпочитать чистое оверлейное решение .

PopupWindow – это именно то, что вам нужно:

Всплывающее окно, которое можно использовать для отображения произвольного вида.

Поскольку PopupWindow действует на уровне Activity , он должен накладывать все на вашу текущую Activity .

Всплывающее окно представляет собой плавающий контейнер, который появляется поверх текущей активности.

Здесь вы можете найти простой пример.

Я, наконец, удалил tabBar и заменил его простыми кнопками, чтобы переключаться между вкладками и помещать их перед тем, как CustomLayout в xml будет рисоваться до него.

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

Это происходит из-за иерархического порядка вашего макета активности. Ваш 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 .