Samsung Galaxy S4 desalinea el icono de la barra de herramientas

Estoy implementando un diseño visual para una aplicación, y resulta que el Galaxy S4 desalinea el icono de inicio de la barra de acción, como se demuestra en la captura de pantalla:

Introduzca aquí la descripción de la imagen

Las capturas de pantalla se tomaron utilizando exactamente el mismo archivo APK en ambos dispositivos. La pauta púrpura se encuentra a 16dp de la izquierda, y es muy importante para el resto de la disposición de la pantalla. El S4 añade otro 8dp o menos. Este margen extra hace que el ícono de inicio se vea fuera de lugar.

He probado un montón de otros teléfonos Samsung en diferentes resoluciones / densidades (Galaxy S3, Galaxy S4 Mini, Galaxy Ace) y todos estos alinean el icono correctamente en 16dp.

Me atrevería a la fragmentación de Android y seguir adelante, pero la cuota de mercado de la Galaxy S4 es tan grande que realmente no puedo ignorar el problema. ¿Alguien más ha encontrado esto, y ha encontrado una solución?

Este código es bastante auto-explicativo. Primero comprueba si el dispositivo actual es un modelo Samsung Galaxy S4, basado en la lista que se encuentra aquí . Si es así, busca las View relevantes basadas en el ActionBar de ActionBar y la posición relativa de ImageView en la jerarquía. A continuación, los desplaza a la izquierda por el parámetro de offset (positivo). También comprueba si se visualiza una View personalizada y cambia también. El único cambio es a las coordenadas x la View , por lo que debería funcionar con cualquier tema o estilo.

 private static final String SAMSUNG = "SAMSUNG"; private static final String[] S4_MODELS = { "GT-I9506", "GT-I9505G", "SGH-I337", "SGH-M919", "SCH-I545", "SPH-L720", "SCH-R970", "GT-I9508", "SCH-I959", "GT-I9502", "SGH-N045", "SGH-I337M", "SGH-M919V", "SCH-R970X", "SCH-R970C" }; private void adjustGalaxyS4(int offset) { if (isGalaxyS4()) shiftHomeView(offset); } private boolean isGalaxyS4() { String manufacturer = Build.MANUFACTURER.toUpperCase(); String model = Build.MODEL.toUpperCase(); if (SAMSUNG.equals(manufacturer) && !TextUtils.isEmpty(model)) { for (String m : S4_MODELS) if (model.contains(m)) return true; } return false; } private void shiftHomeView(float offset) { try { View grandParentView = (View) ((View) findViewById(android.R.id.home).getParent()).getParent(); View upView = ((ViewGroup) ((ViewGroup) grandParentView).getChildAt(0)).getChildAt(0); grandParentView.setX(grandParentView.getX() - offset); upView.setX(upView.getX() + offset); if ((getActionBar().getDisplayOptions() & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) getActionBar().getCustomView().setX(getActionBar().getCustomView().getX() - offset); } catch (Exception e) { // Fail silently } } 
  • Personalizar Android ActionBar
  • ¿Cómo expandir la lista de navegación en la barra de acción?
  • La barra de acciones no se muestra
  • Dot (.) En lugar de la ficha Swipe
  • Submenú ActionBar ActionProvider de Android
  • Anulación de androide: elipse en el subtítulo ActionBar
  • Android L: ActionBar setHideOnContentScrollEnabled
  • Cómo forzar el uso del menú de desbordamiento en los dispositivos con el botón de menú
  • Estilizar la vista de búsqueda de android y la lista desplegable en la barra de acciones
  • Barra de acción El botón Atrás no funciona
  • Quitar Icono pero tener HomeAsUp en ActionBar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.