2014-06-16 12 views
18

sto implementando un visual design per un app, e si scopre che il Galaxy S4 misaligns l'icona Home ActionBar, come dimostrato nello screenshot:Samsung Galaxy S4 misaligns l'icona ActionBar

enter image description here

Gli screenshot sono stati presi usando lo stesso identico file APK su entrambi i dispositivi. La linea guida viola si trova a 16 pp da sinistra ed è molto importante per il resto del layout dello schermo. L'S4 aggiunge un altro 8dp circa. Questo margine extra rende l'icona di casa davvero fuori luogo.

Ho provato un sacco di altri telefoni Samsung con diverse risoluzioni/densità (Galaxy S3, Galaxy S4 Mini, Galaxy Ace) e tutti allineano correttamente l'icona a 16 dpi.

Lo aggiungerei alla frammentazione di Android e andare avanti, ma la quota di mercato del Galaxy S4 è così grande che non posso ignorare il problema. Qualcun altro l'ha incontrato e ha trovato una soluzione?

+0

Confermato lo stesso problema su Galaxy S3 con l'aggiornamento 4.4.2. Davvero davvero fastidioso. – Guzba

+0

Potrebbe essere un problema con i tuoi stili, il 'ActionBar' a volte può essere un po 'complicato a questo riguardo, ma molto probabilmente Samsung ha appena incasinato l'ActionBar. Per prima cosa testerei se un margine negativo risolve il problema. –

+0

Ho avuto lo stesso problema una volta. Avevo 'actionBar.setDisplayHomeAsUpEnabled (true); Ma avevo anche qualcos'altro che non riesco a ricordare in quel momento che ha fatto sparire quella freccia. Provalo ... –

risposta

1

Questo codice è abbastanza auto-esplicativo. Prima controlla se il dispositivo corrente è un modello Samsung Galaxy S4, basato su list found here. Se lo è, cerca quindi i relativi View s in base al layout di ActionBar e alla posizione relativa di home nella gerarchia. Quindi li sposta lasciato dal parametro (positivo) offset. Controlla anche se viene visualizzato un messaggio personalizzato View e sposta anche quello. L'unico cambiamento è nelle coordinate di , quindi dovrebbe funzionare con qualsiasi tema o stile.

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 
    } 
} 
+0

Avevo preferito qualcosa di meno diretto, ma questo è abbastanza efficace come soluzione. Dovrò renderlo un po 'più generico, perché non è esclusivamente il Galaxy S4 che disallinea, quindi cercherò di rilevare il disallineamento della coordinata X attuale rispetto alla coordinata X prevista. È divertente, avevo già scritto qualcosa di simile prima, ma ho provato a regolare i parametri di layout della vista e non riuscivo a farlo funzionare con o senza requestLayout(). A volte l'approccio più semplice della semplice chiamata setX() è chiaramente più convincente. – Barend

+0

alla fine, ci siamo ritrovati a utilizzare la libreria open source MaterialMenu come una vista personalizzata in ActionBar, evitando completamente il problema. – Barend

Problemi correlati