Colocación / superposición (índice-z) una vista encima de las pestañas de la barra de acciones

Tengo una vista que dibuja algo fuera del fragmento que lo contiene y lo configuré para dibujar el contenido fuera de él usando esto .

El problema es que funciona en todas partes, pero en las pestañas ActionBar y ActionBar.

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

Estoy usando appCompat y agregando pestañas de esta manera:

He añadido android:clipChildren="false" a todas las vistas de los padres, pero no funciona sólo para las pestañas ActionBar y ActionBar.

La vista deseada:

Introduzca aquí la descripción de la imagen Pero el resultado es el siguiente:

Introduzca aquí la descripción de la imagen

No es fácil ayudarte sin el código fuente completo; De todos modos puedo sugerirle un acercamiento alternativo que pueda satisfacer su caso.

Si está creando un elemento flotante personalizado (tal vez utilizado para un tutorial o una sugerencia), debe evitar alterar la jerarquía de vistas básicas y preferir una solución de superposición pura .

El PopupWindow es exactamente lo que necesita:

Una ventana emergente que se puede utilizar para mostrar una vista arbitraria.

Dado que el PopupWindow actúa en el nivel de Activity , debe superponerse a todo en su Activity actual .

La ventana emergente es un contenedor flotante que aparece encima de la actividad actual.

Aquí puede encontrar un ejemplo sencillo.

Finalmente eliminé la tabBar y la reemplazé con simples botones para cambiar entre las pestañas y colocarlo antes de CustomLayout en xml para dibujar antes de él.

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

Esto ocurre debido al orden jerárquico del diseño de su actividad. Tu ActionBar se está dibujando sobre tu vista. Puedes encontrar el marco de tu actividad y añadir la vista allí.

 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; } 

También recuerda quitar la vista cuando navegas lejos a otro fragmento.

 frameLayoutRoot.removeView(circleView); 

Editar:

Tenga en cuenta que esto es algo que debe hacer en el nivel que añade ActionBar , que es la actividad. En ese caso, no necesitaría estas soluciones. Estas cosas son mucho más fáciles de lograr con ToolBar .

  • Solución alternativa / polyfill para Android 4.0.3
  • Barra de herramientas pull-up utilizando sólo HTML y CSS en el navegador de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.