Publicado por Ian Lake, Representante de desarrolladores

Biblioteca de compatibilidad de Android 23.2


Cuando hablamos de la biblioteca de compatibilidad de Android, es importante observar que no se trata de una biblioteca monolítica, sino de una colección completa de bibliotecas con las que se intenta ofrecer versiones de API compatibles con lanzamientos anteriores y, además, funciones exclusivas sin necesidad de contar con la última versión de la plataforma. En la versión 23.2 se suman nuevas bibliotecas de compatibilidad y nuevas funciones a muchas de las bibliotecas existentes.

Compatibilidad con interfaces dibujables en vector convencionales y animadas


Las interfaces dibujables en vector te permiten reemplazar varios recursos png por un único gráfico vectorial definido en XML. Aunque antes VectorDrawable y AnimatedVectorDrawable estaban limitados a dispositivos con Lollipop o versiones superiores, ahora se encuentran disponibles a través de dos bibliotecas de compatibilidad nuevas: support-vector-drawable y animated-vector-drawable, respectivamente.

En Android Studio 1.4, se presentó una compatibilidad limitada con interfaces dibujables en vector mediante la generación de recursos png en el momento de la compilación. Para deshabilitar esta funcionalidad (y acceder a la ventaja y el ahorro de espacio reales de esta biblioteca de compatibilidad), debes agregar vectorDrawables.useSupportLibrary = true a tu archivo build.gradle:
 // Gradle Plugin 2.0+  
 android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
    }  
 }  

Notarás que este nuevo atributo solo existe en la versión 2.0 del complemento de Gradle. Si estás usando Gradle 1.5, aplicarás:

 // Gradle Plugin 1.5  
 android {  
   defaultConfig {  
     generatedDensities = []  
  }  

  // This is handled for you by the 2.0+ Gradle Plugin  
  aaptOptions {  
    additionalParameters "--no-version-vectors"  
  }  
 }  


Podrás usar VectorDrawableCompat hasta la API 7 y AnimatedVectorDrawableCompat en todos los dispositivos que tengan la API 11 y versiones posteriores. Debido a la manera en que Android carga las interfaces dibujables, no todos los sitios en los que se acepte un Id. de interfáz dibujable (como un archivo XML) admitirán la carga de interfaces dibujables en vector. Afortunadamente, en AppCompat se agregaron varias funciones para facilitar el uso de tus nuevas interfaces dibujables en vector.

En primer lugar, cuando uses AppCompat con ImageView (o subclases como ImageButton y FloatingActionButton), podrás emplear el nuevo atributo app:srcCompat para hacer referencia a interfaces dibujables en vector (y a cualquier otra interfaz dibujable disponible para android:src):
 <ImageView  
  android:layout_width="wrap_content"  
  android:layout_height="wrap_content"  
  app:srcCompat="@drawable/ic_add" />  


Si modificas interfaces dibujables en el tiempo de ejecución, podrás usar el mismo método setImageResource() de antes; no hay cambios en este aspecto. El uso de AppCompat y app:srcCompat es el método más infalible para integrar interfaces dibujables en vector a tu aplicación.

Podrás observar que la referencia directa a interfaces dibujables en vector fuera de app:srcCompat no funcionará en versiones anteriores a Lollipop. Sin embargo, AppCompat admite la carga de interfaces dibujables en vector cuando se hace referencia a ellas en otro contenedor de interfaces dibujables, como StateListDrawable, InsetDrawable,LayerDrawable, LevelListDrawable y RotateDrawable. Con este direccionamiento indirecto, puedes usar interfaces dibujables en vector en casos como los del atributo android:drawableLeft de TextView, que normalmente no podría admitirlas.

Tema DayNight de AppCompat


Si bien la posibilidad de habilitar el uso de gráficos vectoriales en tu aplicación representa ya un enorme cambio para AppCompat, se agregó un nuevo tema en esta versión: Theme.AppCompat.DayNight.

Antes de la API 14, el tema DayNight y sus derivados DayNight.NoActionBar, DayNight.DarkActionBar y DayNight.Dialog, entre otros, se convierten en sus equivalentes de Light. Sin embargo, en dispositivos con la API 14 y versiones posteriores, este tema permite que las aplicaciones admitan fácilmente un tema Light y uno Dark, lo cual hace posible un cambio efectivo entre estos, según sean “night”.

De manera predeterminada, el hecho de que sean “night” supondrá una coincidencia con el valor de sistema (de UiModeManager.getNightMode()), pero puedes sobrescribir dicho valor con métodos de AppCompatDelegate. Podrás configurar el valor predeterminado en toda tu aplicación (hasta el reinicio del proceso) con el método estático AppCompatDelegate.setDefaultNightMode() o recuperar un elemento AppCompatDelegate a través de getDelegate() y usar setLocalNightMode() para modificar únicamente los elementos Activity o Dialog actuales.

Al usar AppCompatDelegate.MODE_NIGHT_AUTO, se emplean la hora del día y tu última ubicación conocida (si tu aplicación cuenta con los permisos de ubicación) para aplicar automáticamente el cambio del día a la noche, mientras que MODE_NIGHT_NO y MODE_NIGHT_YES hacen de manera forzosa que no se use nunca o se use siempre un tema Dark, respectivamente.

Es esencial que pruebes por completo tu aplicación al usar los temas DayNight, ya que los colores codificados pueden fácilmente hacer que el texto o los iconos se vuelvan ilegibles. Si usas los estilos estándares TextAppearance.AppCompat para el texto o los colores extraídos de tu tema (por ejemplo,android:textColorPrimary), verás que estos se actualizarán automáticamente.

Sin embargo, si deseas personalizar los recursos específicamente para el modo noche, AppCompat reutiliza la carpeta de calificadores de recursos de noche. Esto permite personalizar todos los recursos que puedas necesitar. Considera usar los colores estándares o aprovechar la compatibilidad con matices de AppCompat para simplificar mucho más la compatibilidad con este modo.


Biblioteca de compatibilidad de diseño: hojas inferiores


La biblioteca de compatibilidad de diseño ofrece implementaciones de numerosos patrones de Material Design. Esta versión permite que los desarrolladores agreguen fácilmente hojas inferiores a sus aplicaciones.

Al adjuntar un elemento BottomSheetBehavior a un View secundario de un elemento CoordinatorLayout (es decir, al agregar app:layout_behavior="android.support.design.widget.BottomSheetBehavior"), podrás obtener en forma automática la detección de toques correspondiente para la transición entre cinco estados:
  • STATE_COLLAPSED: este estado de contracción es el valor predeterminado y muestra solo una parte del diseño en la parte inferior. Se puede controlar la altura con el atributo app:behavior_peekHeight (su valor predeterminado es 0).
  • STATE_DRAGGING: estado intermedio que tiene lugar mientras el usuario arrastra en forma directa la hoja inferior hacia arriba o abajo.
  • STATE_SETTLING: momento breve que tiene lugar entre el inicio de View y su posicionamiento en el lugar final que ocupará.
  • STATE_EXPANDED: estado de expansión total de la hoja inferior, en el cual esta es totalmente visible (si su altura es inferior a la del elemento CoordinatorLayout que la contiene) o el elemento CoordinatorLayout se rellena.
  • STATE_HIDDEN: se encuentra deshabilitado de manera predeterminada (se habilita con el atributo app:behavior_hideable) y su habilitación permite a los usuarios deslizar la hoja inferior para ocultarla por completo.


Ten en cuenta que los contenedores de desplazamiento de tu hoja inferior deben admitir el desplazamiento anidado (por ejemplo, NestedScrollView, RecyclerView o ListView/ScrollView en la API 21 y versiones posteriores).

Si deseas recibir callbacks de cambios de estado, puedes agregar un elemento BottomSheetCallback:
 // The View with the BottomSheetBehavior  
 View bottomSheet = coordinatorLayout.findViewById(R.id.bottom_sheet);  
 BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);  
 behavior.setBottomSheetCallback(new BottomSheetCallback() {  
    @Override  
    public void onStateChanged(@NonNull View bottomSheet, int newState) {  
      // React to state change  
    }  
      @Override  
      public void onSlide(@NonNull View bottomSheet, float slideOffset) {  
       // React to dragging events  
   }  
 });  
Aunque BottomSheetBehavior se aplica al caso de las hojas inferiores persistentes, en esta versión también se proporcionan elementos BottomSheetDialog y BottomSheetDialogFragment para abarcar el caso de las hojas inferiores modales. Simplemente, reemplaza AppCompatDialog o AppCompatDialogFragment por sus equivalentes de hojas inferiores para dar a tu cuadro de diálogo el estilo de una de estas.

Biblioteca de compatibilidad v4: MediaBrowserServiceCompat


La biblioteca de compatibilidad v4 sirve como base para gran parte de las bibliotecas de compatibilidad y en ella se incluyen backports de muchas funciones de framework presentadas en nuevas versiones de la plataforma (además de varias funciones exclusivas).

Como complemento de la clase MediaSessionCompat lanzada previamente, y con el propósito de brindar una base sólida para la reproducción de medios, esta versión suma MediaBrowserServiceCompat y MediaBrowserCompat, lo cual proporciona una solución compatible que acerca las últimas API (incluso las que se agregaron en Marshmallow) a todos los dispositivos con la API 4 y versiones posteriores. Esto hace que resulte mucho más sencillo ofrecer compatibilidad con la reproducción de audio en Android Auto y la exploración de medios en Android Wear. Además, brinda una interfaz estándar que puedes usar para conectar tu servicio de reproducción de medios y tu IU.

RecyclerView


El widget RecyclerView proporciona una base avanzada y flexible para crear listas y cuadrículas, además de admitir animaciones. Esta versión aporta una fabulosa función nueva a la API de LayoutManager: el dimensionamiento automático. Esto permite que RecyclerView ajuste su tamaño en forma automática según el tamaño de su contenido. Esto significa que ahora son posibles acciones que previamente no lo eran; por ejemplo, el uso de WRAP_CONTENT para una dimensión de RecyclerView. Verás que todos los elementos LayoutManagers integrados ahora admiten el dimensionamiento automático.

Debido a este cambio, debes controlar muy bien los parámetros de diseño de tus vistas de elementos. Ahora se respetarán los parámetros de diseño previamente ignorados (como MATCH_PARENT en la dirección de desplazamiento).

Si dispones de un elemento LayoutManager personalizado que no extiende uno de los elementos LayoutManagers integrados, se trata de una API de inclusión. Deberás llamar a setAutoMeasureEnabled(true) y realizar algunos cambios menores según lo detallado en el Javadoc del método.

Ten en cuenta que si bien RecyclerView anima a sus hijos, no anima sus propios cambios de límites. Si deseas animar los límites de RecyclerView a medida que cambien, puedes usar las API de transición.

Pestañas personalizadas


Las pestañas personalizadas hacen posible la transición a contenido web sin inconvenientes y, al mismo tiempo, conservan el aspecto de tu aplicación. Con esta versión, ahora podrás agregar acciones a una barra inferior para que se visualicen junto al contenido web.


Con el nuevo método addToolbarItem(), podrás agregar hasta 5 acciones (MAX_TOOLBAR_ITEMS) a la barra inferior y actualizarlas con setToolbarItem() una vez que se inicie la sesión. De una manera similar a la que ofrecía el método setToolbarColor() anterior, también podrás hallar un método setSecondaryToolbarColor() para personalizar el color de fondo de la barra inferior.


Leanback para Android TV


La biblioteca Leanback te proporciona las herramientas que necesitas para llevar fácilmente tu aplicación a Android TV, con muchos componentes estándares optimizados para la experiencia de TV. El elemento GuidedStepFragment recibió un conjunto importante de mejoras con esta versión.


El cambio más visible probablemente sea la introducción de una segunda columna para botones de acción (se agrega sobrescribiendo onCreateButtonActions() o llamando a setButtonActions()). Esto hace que sea mucho más fácil acceder a acciones de finalización sin necesidad de recorrer la lista de GuidedActions disponibles.

Ya que se mencionó GuidedActions... hay varias funciones nuevas que permiten entradas de mayor contenido, como descripciones editables (a través de descriptionEditable()), subacciones bajo la forma de menús desplegables (con subActions()) y un elemento GuidedDatePickerAction.





Estos componentes deberían hacer que te resulte mucho más sencillo obtener información del usuario cuando sea absolutamente obligatorio.


Disponible ahora


La versión 23.2 de la biblioteca de compatibilidad de Android se encuentra disponible a través de tu SDK Manager y de Android Studio. ¡Aprovecha hoy mismo todas las funciones nuevas y las correcciones de errores adicionales! Como siempre, registra informes de errores en b.android.com y conéctate con otros desarrolladores en la comunidad de Google+ para el desarrollo de Android.