Подтвердить что ты не робот

Samsung Galaxy S4 сопоставляет значок Actionbar

Я реализую визуальный дизайн для приложения, и выясняется, что Galaxy S4 смещает значок домашней панели действия, как показано на скриншоте:

enter image description here

Снимки экрана были сделаны с использованием того же файла APK на обоих устройствах. Фиолетовый ориентир находится на расстоянии 16dp слева, и это очень важно для остальной части экрана. S4 добавляет еще 8 дп или около того. Этот дополнительный запас делает домашний значок действительно неуместным.

Я пробовал кучу других телефонов Samsung с разными разрешениями/плотностью (Galaxy S3, Galaxy S4 Mini, Galaxy Ace), и все они правильно выравнивают значок на 16dp.

Я бы записал его на фрагментацию Android и перешел, но рынок Galaxy S4 настолько велик, что я не могу игнорировать эту проблему. Кто-нибудь еще столкнулся с этим и нашел исправление?

4b9b3361

Ответ 1

Этот код довольно понятен. Сначала он проверяет, является ли текущее устройство моделью Samsung Galaxy S4, основанной на списке, найденном здесь. Если это так, тогда он ищет соответствующий View на основе макета ActionBar и относительной позиции home ImageView в иерархии. Затем он сдвигает их налево (положительный) параметр offset. Он также проверяет, отображается ли пользовательский View, и также сдвигает его. Единственное изменение в координатах View s 'x, поэтому оно должно работать с любой темой или стилем.

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