poner para navegacion herramientas google configurar como chrome busqueda barra agregar activar android xamarin.android material-design android-toolbar

android - navegacion - Agregar elevación/sombra en la barra de herramientas para dispositivos pre-piruletas



configurar barra busqueda google chrome (8)

Actualicé mi aplicación de Android al nuevo diseño de material, pero también quería agregar algo de sombra o elevación a la barra de herramientas. Parece que hay algunas maneras (hacky) de hacerlo a través de imágenes / 9 parches, pero me pregunto si se puede hacer a través de las bibliotecas de soporte. (al igual que CardView puede tener elevación)

Según this respuesta en otra pregunta, esto es posible envolviendo la Toolbar de Toolbar en un AppBarLayout , pero esto no funciona para mí.

Mi diseño:

<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.AppBarLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.Toolbar android:id="@+id/Toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?attr/actionBarSize" android:background="?attr/colorPrimary" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> </android.support.design.widget.AppBarLayout>

También intenté establecer la elevación a través de XML y a través del código, pero eso tampoco funciona.

¡Cualquier ayuda sería apreciada! Gracias por adelantado.

Actualizar:

Como incluyo el diseño de mi barra de herramientas en mis otros diseños, a continuación se muestra uno de mis diseños principales:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <include layout="@layout/Toolbar" /> <fragment class="OverAllField.XamarinAndroid.Fragments.Planning.PlanningFragment" android:id="@+id/PlanningFragment" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> </LinearLayout>


Creo que la mejor solución es poner una vista de sombra de degradado debajo de la barra de herramientas y manipular con visibilidad depende del SDK del dispositivo.

toolbar.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="@android:color/white" android:fitsSystemWindows="true" app:popupTheme="@style/AppTheme.PopupOverlay"> <TextView android:id="@+id/centerTitleToolbarTextView" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:maxLines="1" android:textColor="@color/color_toolbar" android:textSize="@dimen/titleToolbar" /> </android.support.v7.widget.Toolbar> <View android:id="@+id/shadow_view" android:layout_width="match_parent" android:visibility="gone" android:layout_height="4dp" android:background="@drawable/toolbar_shadow" /> </LinearLayout>

toolbar_shadow.xml

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <gradient android:startColor="#c1c1c1" android:centerColor="#e6e6e6" android:endColor="#f1f1f1" android:angle="270" /> </shape>

MainActivity.class

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { findViewById(R.id.shadow_view).setVisibility(View.VISIBLE); }


Intente usar AppBarLayout dentro del diseño de la actividad. Tratar:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <include layout="@layout/Toolbar" /> </android.support.design.widget.AppBarLayout> <fragment class="OverAllField.XamarinAndroid.Fragments.Planning.PlanningFragment" android:id="@+id/PlanningFragment" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> </LinearLayout>

Toolbar.xml

<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/Toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?attr/actionBarSize" android:background="?attr/colorPrimary" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />


Para Android 5.0 y superior: AppBarLayout proporciona / da sombra automáticamente en el diseño. También puede aumentar la elevación de AppBarLayout por app:elevation="4dp" .

Para Pre-Lollipop: puede usar el siguiente enlace: https://github.com/vipulasri/Toolbar-Elevation-Pre-Lollipop

Nota: la barra de herramientas también es compatible con la elevación, usando android:elevation="4dp"

Nueva actualización: en Appcompat v24.0.0 , no puede establecer la elevación en AppBarLayout usando setElevation() y app:elevation ya que están en desuso.

stateListAnimator usar la propiedad stateListAnimator para establecer la elevación ahora.

Nota: establezca la duración en 1 ms en StateListAnimator para evitar demoras en el dibujo de elevación .

El cambio de elevación de AppBarLayout se retrasa en appCompat v24.0.0

appbar_always_elevated.xml en la carpeta animator-v21 en el directorio res .

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item> <objectAnimator android:propertyName="elevation" android:valueTo="8dp" android:valueType="floatType" android:duration="1"/> </item> </selector>

En AppbarLayout:

<android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="300dp" android:fitsSystemWindows="true" android:stateListAnimator="@animator/appbar_always_elevated" android:theme="@style/AppTheme.AppBarOverlay"> </android.support.design.widget.AppBarLayout>


También he perdido 1 día en este tema, pero finalmente descubrí una manera de hacerlo funcionar.

/** * Controller for the toolbar which will take care of the drop down shadow also on pre-lollipop devices. * <br/> * The controller also handles the status bar based on the state of the toolbar. * <p/> * Created by <b>Negru Ionut Valentin</b> on <b>20/1/2016</b>. */ public class ToolbarController { private boolean handleStatusBar = false; private boolean showTitle = true; /** * Call this method in onCreate() method of your Activity or in onCreateView() in Fragment * * @param view * The view into which to look for the toolbar * @param activity * The activity for which setup the toolbar * * @return The toolbar found and customized or {@code null} */ public Toolbar initToolbar(View view, Activity activity) { Toolbar mToolbar = (Toolbar) view.findViewById(R.id.toolbar); // Valid and visible toolbar - otherwise ignore if (null != mToolbar && mToolbar.getVisibility() == View.VISIBLE) { int paddingLeft = mToolbar.getPaddingLeft(); int paddingRight = mToolbar.getPaddingRight(); int paddingBottom = mToolbar.getPaddingBottom(); // Set the top padding of the toolbar to match the status bar height int paddingTop = new CynnyContextWrapper(activity).getStatusBarHeight(); mToolbar.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom); if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP) { ViewParent parent = mToolbar.getParent(); if (parent instanceof RelativeLayout) { // Manually create the drop shadow RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, Metrics.convertDpToPixel(4, activity)); View dropShadow = new View(activity); dropShadow.setBackgroundResource(R.drawable.toolbar_shadow); params.addRule(RelativeLayout.BELOW, R.id.toolbar); ((RelativeLayout) parent).addView(dropShadow, params); } } if (activity instanceof AppCompatActivity) { // Check if the Activity actually support ActionBar with Toolbar and set our custom Toolbar for it ((AppCompatActivity) activity).setSupportActionBar(mToolbar); // Get the actionbar from the activity ActionBar actionBar = ((AppCompatActivity) activity).getSupportActionBar(); if (null != actionBar) { // If the actionbar is valid, customize it actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeButtonEnabled(true); actionBar.setDisplayShowTitleEnabled(this.showTitle); mToolbar.setNavigationIcon(R.drawable.ic_arrow_back_selector); } } if (this.handleStatusBar) { // For showing the status bar activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); } } else if (handleStatusBar) { // Force hide the status bar activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); } return mToolbar; } /** * Set the flag indicating if the controller should handle or not the status bar. * * @param handleStatusBar * Flag which indicates if the initialization of the toolbar should also update * the status bar state (if two calls are made for the init, the last one will * be taken into consideration). * * @return The current toolbar controller. */ public ToolbarController setHandleStatusBar(boolean handleStatusBar) { this.handleStatusBar = handleStatusBar; return this; } /** * Set the flag indicating if the toolbar should show or hide the title. * * @param showTitle * Flag indicating if the toolbar should also show the title (the title can be changed after the toolbar * initialization) * * @return The current toolbar controller. */ public ToolbarController setShowTitle(boolean showTitle) { this.showTitle = showTitle; return this; } }

En la actividad, debe usar esto en el método onCreate () de esta manera:

// Create and customize the Toolbar controller new ToolbarController().setHandleStatusBar(true).setShowTitle(true) .initToolbar(((ViewGroup) findViewById(android.R.id.content)).getChildAt(0), this);

En el fragmento, debe usar esto en el método onCreateView () de esta manera:

new ToolbarController().setHandleStatusBar(false).setShowTitle(false).initToolbar(resultView, getActivity());

No olvide agregar su barra de herramientas en los diseños y establecer su id con android:id="@id/toolbar" . Si desea utilizar otra identificación, puede personalizar el controlador y agregar otro método de configuración que use la identificación que proporcione.

Tengo dos diseños de barra de herramientas creados:

v21

<!-- This is the new widget added in Lollipop - use with care --> <android.support.v7.widget.Toolbar android:id="@id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?attr/actionBarSize" android:theme="@style/TitleToolbarTheme" android:background="?android:attr/colorPrimary" android:elevation="@dimen/toolbar_elevation" /> </merge>

otro

<?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android" > <!-- This is the new widget added in Lollipop - use with care --> <android.support.v7.widget.Toolbar android:id="@id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?attr/actionBarSize" android:theme="@style/TitleToolbarTheme" android:background="?attr/colorPrimary" /> </merge>

Los uso en diseños de mayo usando:

<include layout="@layout/toolbar" />

Espero que esto ayude a resolver su problema. También tenga en cuenta que esto se puede optimizar aún más, pero funciona para mí y no quiero perder más tiempo en este tema.


Tengo un CollapsingToolbarLayout con Toolbar y una View similar a la barra de herramientas que se mueve hacia arriba y hacia abajo, pero se encuentra por encima de NestedScrollView , como en https://github.com/k0shk0sh/CoordinatorLayoutExample . Probé muchas variantes. A veces, una sombra se desplaza sobre una pantalla con NestedScrollView, a veces la barra de herramientas dibuja una sombra sólida sin transparencia, a veces la sombra tiene un alias. De todos modos, esta es mi solución.

Digamos que tienes un diseño:

<android.support.design.widget.CoordinatorLayout> <android.support.design.widget.AppBarLayout> <android.support.design.widget.CollapsingToolbarLayout> <android.support.v7.widget.Toolbar> <!-- Toolbar views if needed --> </android.support.v7.widget.Toolbar> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> <!-- Footer Toolbar views if needed --> <android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <LinearLayout> <!-- Views --> </LinearLayout> </android.support.v4.widget.NestedScrollView> <!-- Add this view. It draws a shadow and aligns top of NestedScrollView --> <!-- Set visibility to gone or visible --> <View android:id="@+id/scroll_shadow" android:layout_width="match_parent" android:layout_height="4dp" android:background="@drawable/shadow" android:visibility="gone" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </android.support.design.widget.CoordinatorLayout>

Agregue una sombra ( drawable / shadow.xml ):

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <gradient android:angle="90" android:endColor="#ffcccccc" android:startColor="#00cccccc" /> </shape>

Agrega este método. Aquí scrollShadow es una vista llamada "scroll_shadow":

private void setShadowVisibility(int visibility) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { scrollShadow.setVisibility(visibility); } }

Manipúlelo como desee. Mostrará un gradiente en dispositivos pre-Lollipop y mostrará una sombra normal para Android 5.0+.


Una solución simple, cuando se usa CoordinatorLayout , es anclar un ImageView con la "sombra" justo debajo de AppBarLayout o Toolbar . Esto incluso funciona con CollapsingToolbarLayout , y se representa correctamente sobre el "contenido":

<android.support.v7.widget.CardView android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="top" app:cardCornerRadius="0dp"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:popupTheme="@style/AppTheme.PopupOverlay" /> </android.support.design.widget.AppBarLayout> </android.support.v7.widget.CardView>

Cree un archivo res/layout/app_bar_shadow.xml , que solo se usará en dispositivos anteriores a Lollipop:

<ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:adjustViewBounds="true" app:layout_anchor="@+id/app_bar" app:layout_anchorGravity="bottom" android:layout_gravity="bottom" app:srcCompat="@drawable/shadow_app_bar" />

Cree un archivo "vacío" res/layout-v21/app_bar_shadow.xml , utilizado para dispositivos Android 5+:

<merge/>

Finalmente, un res/drawable/shadow_app_bar.xml :

<shape> <gradient android:angle="90" android:startColor="#00000000" android:endColor="#30000000" /> <size android:height="@dimen/design_appbar_elevation" /> </shape>


Use CardView

<android.support.v7.widget.CardView android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="top" app:cardCornerRadius="0dp"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:popupTheme="@style/AppTheme.PopupOverlay" /> </android.support.design.widget.AppBarLayout> </android.support.v7.widget.CardView>


usar archivo de compilación:

compile ''com.android.support:cardview-v7:23.1.1''

consulte este enlace

para llamar en xml agregar:

app:cardElevation="8dp" app:cardCornerRadius="8dp" app:contentPadding="5dp"