三星Galaxy S4未对准Actionbar图标

时间:2014-06-16 09:26:24

标签: android android-actionbar

我正在为应用程序实现视觉设计,事实证明Galaxy S4未对齐操作栏主页图标,如屏幕截图所示:

enter image description here

截图是在两台设备上使用完全相同的APK文件拍摄的。紫色指南位于距左侧16dp处,对于屏幕布局的其余部分来说非常重要。 S4增加了8dp左右。这个额外的余量使得主页​​图标看起来真的不合适。

我尝试了不同分辨率/密度的其他三星手机(Galaxy S3,Galaxy S4 Mini,Galaxy Ace),这些都在16dp正确对齐图标。

我将其归结为Android碎片并继续前进,但Galaxy S4的市场份额如此之大以至于我无法忽视这个问题。有没有其他人遇到这个,并找到了解决办法?

1 个答案:

答案 0 :(得分:2)

这段代码非常明显。它首先根据list found here检查当前设备是否为Samsung Galaxy S4型号。如果是,则会根据View的布局以及ActionBar home在层次结构中的相对位置查找相关的ImageView。然后它将 left 移动到(正)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
    }
}