studio icono boton barra bar agregar actionbar acciones android view android-actionbar z-index

android - icono - visualización en la parte superior de la barra de acciones



menu toolbar android (9)

¿Hay alguna manera de mostrar una vista en la parte superior de la barra de acciones? Quiero crear un pequeño cuadro de sugerencias que apuntará al usuario a un elemento en la barra de acciones. Sé que un Toast con una vista de conjunto se representará encima de la barra de acciones. ¿Alguien sabe cómo hacer esto con una vista?

FrameLayout usar FrameLayout con layout_gravity="top" e inflar una vista y luego agregarla al diseño de la actividad en ejecución.

Te agradezco de antemano.

Editar : Aquí hay una imagen de lo que estaba pensando:

Editar : Tal vez se necesitan más detalles. Estoy buscando una manera, o para saber si es posible agregar una vista a la jerarquía de vista de la actividad para que se represente al final.

De forma similar a CSS, deseo un orden de índice Z más alto para esta vista particular (el cuadro flotante azul en la imagen), de modo que se represente en la parte superior de la región de la Barra de acciones en la actividad. La vista no está asociada de ninguna manera con la barra de acciones, simplemente se dibuja encima de ella.


(Referencia: http://www.vogella.com/articles/AndroidActionBar/article.html )
Vistas personalizadas en ActionBar
También puede agregar una vista personalizada a la ActionBar . Para esto, usa el método setCustomView para la clase ActionView . También debe habilitar la visualización de vistas personalizadas a través del método setDisplayOptions() pasando el indicador ActionBar.DISPLAY_SHOW_CUSTOM .

Por ejemplo, puede definir un archivo de diseño que contenga un elemento EditText .

<?xml version="1.0" encoding="utf-8"?> <EditText xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/searchfield" android:layout_width="match_parent" android:layout_height="match_parent" android:inputType="textFilter" >

Este diseño se puede asignar a la ActionBar través del siguiente código. El código de ejemplo permite asociar un oyente a la vista personalizada.

package com.vogella.android.actionbar.customviews; import android.app.ActionBar; import android.app.Activity; import android.os.Bundle; import android.view.KeyEvent; import android.widget.EditText; import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; import android.widget.Toast; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ActionBar actionBar = getActionBar(); // add the custom view to the action bar actionBar.setCustomView(R.layout.actionbar_view); EditText search = (EditText) actionBar.getCustomView().findViewById(R.id.searchfield); search.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { Toast.makeText(MainActivity.this, "Search triggered", Toast.LENGTH_LONG).show(); return false; } }); actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME); } }


Después de luchar conmigo mismo bastante tiempo, aquí está la solución (lo probé, funciona bien):

Los pasos generales son:

  1. Crear una vista de contenedor
  2. Separe los niños de la vista de pantalla, coloque el envoltorio y coloque los niños
  3. Inflar el contenido a los niños
  4. Controlar el contenedor te ayudará a controlar exactamente la barra de acción y el contenido debajo de todo.
  5. Ahora, usando el contenedor, puede agregar "hermanos" a la barra de acciones / área principal. Ese hermano es exactamente lo que describes en tu imagen.

Veamos un poco de código.

Primero, crea un método para ayudar a crear una vista de contenedor. el contenedor se colocará entre toda la pantalla y el contenido de su aplicación. al ser un ViewGroup , más adelante puedes controlar completamente su contenido.

private ViewGroup setContentViewWithWrapper(int resContent) { ViewGroup decorView = (ViewGroup) this.getWindow().getDecorView(); ViewGroup decorChild = (ViewGroup) decorView.getChildAt(0); // Removing decorChild, we''ll add it back soon decorView.removeAllViews(); ViewGroup wrapperView = new FrameLayout(this); // You should set some ID, if you''ll want to reference this wrapper in that manner later // // The ID, such as "R.id.ACTIVITY_LAYOUT_WRAPPER" can be set at a resource file, such as: // <resources xmlns:android="http://schemas.android.com/apk/res/android"> // <item type="id" name="ACTIVITY_LAYOUT_WRAPPER"/> // </resources> // wrapperView.setId(R.id.ACTIVITY_LAYOUT_WRAPPER); // Now we are rebuilding the DecorView, but this time we // have our wrapper view to stand between the real content and the decor decorView.addView(wrapperView, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); wrapperView.addView(decorChild, decorChild.getLayoutParams()); LayoutInflater.from(this).inflate(getActivityLayout(), (ViewGroup)((LinearLayout)wrapperView.getChildAt(0)).getChildAt(1), true); return wrapperView; }

Ahora, interfiere con la creación de la Activity normal, y en lugar de usar setContentView , utiliza el método que hemos creado.

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // DON''T CALL `setContentView`, // we are replacing that line with this code: ViewGroup wrapperView = setContentViewWithWrapper(R.layout.activity_layout); // Now, because the wrapper view contains the entire screen (including the notification bar // which is above the ActionBar) I think you''ll find it useful to know the exact Y where the // action bar is located. // You can use something like that: ViewGroup actionBar = (ViewGroup)((LinearLayout)wrapperView.getChildAt(0)).getChildAt(0); int topOffset = actionBar.getTop(); // Now, if you''ll want to add a view: // 1. Create new view // 2. Set padding top - use "topOffset" // 3. Add the view to "wrapperView" // 4. The view should be set at front. if not - try calling to "bringToFront()" }

Eso es todo.

Notas

  • Utilicé el visor de jerarquía de Android para entender cuál es la jerarquía correcta. (no adivinó esos índices 0 y 1 )
  • Si está utilizando algún tipo de menú desplegable en su actividad, puede que tenga que configurarlo un poco diferente ya que los cajones ya están creando ese contenedor para usted
  • Aprendí mucho mirando esta gran biblioteca

EDITAR: Consulte @ CristopherOyarzúnAltamirano Answer para obtener más asistencia sobre las versiones más nuevas de Android

¡Buena suerte!


Encontré esta solución basada en la respuesta de @Sean:

//This is for Jelly, ICS, Honeycomb if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB && Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2){ LayoutInflater.from(this).inflate(resContent, (ViewGroup)((LinearLayout)wrapperView.getChildAt(0)).getChildAt(1), true);} //This is for KitKat and Jelly 4.3 else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2){ LayoutInflater.from(this).inflate(resContent, (ViewGroup) (((ViewGroup) wrapperView.getChildAt(0)).getChildAt(0)), true);} //This is for Ginger else{ LayoutInflater.from(this).inflate(resContent, (ViewGroup) ((LinearLayout)((FrameLayout) wrapperView.getChildAt(0)).getChildAt(0)).getChildAt(1), true);}


Encontré una manera mucho más simple de hacer esto. Acabo de aplicar Android: traducciónZ = "10dp" a la vista que necesito para cubrir la barra de acciones.

Elegí 10dp, pero en realidad puede ser lo que quieras, siempre que sea superior a la elevación de la barra de acciones

<ImageView android:layout_width="100dp" android:layout_height="100dp" android:translationZ="10dp" android:src="@drawable/potatoe" />

Además, no se preocupe por la siguiente advertencia de Android Studio:

"translationZ no se puede usar con API <21".

Se ignorará, pero realmente no te importa porque la barra de herramientas no debe cubrir tu vista con API inferiores a 21.


Estaba tratando de lograr algo más, pero necesitaba una solución similar a esta. Necesitaba dibujar una capa opaca que cubriera toda la pantalla, incluso la barra de acciones, algo así como un diálogo. Lo hice de esta manera:

ViewGroup vg = (ViewGroup)(getWindow().getDecorView().getRootView()); vg.addView(myNewView, params);

esto se puede usar para dibujar cualquier cosa en cualquier lugar de la pantalla.


Hay una manera mucho más simple de lograr esto. ActionBar mantiene su diseño en la clase ActionBarContainer que simplemente hereda de FrameLayout. Por lo tanto, para mostrar algo en ActionBar, debe obtener una referencia al ActionBarContainer y agregarle su propia vista personalizada. Aquí está el código

int abContainerViewID = getResources().getIdentifier("action_bar_container", "id", "android"); FrameLayout actionBarContainer = (FrameLayout)findViewById(abContainerViewID); LayoutInflater myinflater = getLayoutInflater(); View customView = myinflater.inflate(R.layout.yourCustomeViewLayout, null); actionBarContainer.addView(customView);


Intenta usar ActionBar.setCustomView (). Esa es la única forma de cambiar la apariencia de esa área de la pantalla. No puede pegar una Vista en el área "arriba" de la barra de acciones, porque esa área básicamente está controlada por el sistema. Por otro lado, puede proporcionar su propio diseño para ello.

Si explica con más detalle lo que está tratando de hacer, los encuestados pueden tener algunas mejores ideas de diseño.


Usa el android:actionLayout en tu archivo menu.xml.

<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_id" android:title="@string/menu_string_to_show" android:icon="@drawable/ic_menu_icon_name" android:showAsAction="always" android:actionLayout="@layout/action_button_foo" /></menu>

Luego crea tu diseño action_button_foo.xml:

<?xml version="1.0" encoding="utf-8"?><TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="@string/menu_string_to_show" android:drawableLeft="@drawable/ic_menu_icon_name" android:background="@drawable/bg_btn_action_bar" android:clickable="true" />

Para manejar el clic, haga lo siguiente:

@Overridepublic boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.my_menu, menu); final MenuItem item = menu.findItem(R.id.menu_id); item.getActionView().setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { onOptionsItemSelected(item); } }); return super.onCreateOptionsMenu(menu);}

Eso es si :)