Android 三星Galaxy S4未对齐Actionbar图标

Android 三星Galaxy S4未对齐Actionbar图标,android,android-actionbar,Android,Android Actionbar,我正在为一个应用程序实施一个可视化设计,结果发现Galaxy S4与actionbar home图标错位,如屏幕截图所示: 截图是在两台设备上使用完全相同的APK文件拍摄的。紫色指导线位于左侧16dp处,对屏幕布局的其余部分非常重要。S4再增加一个8dp左右。这个额外的边距使主图标看起来很不合适 我试过一系列其他三星手机,它们的分辨率/密度不同(Galaxy S3、Galaxy S4 Mini、Galaxy Ace),所有这些手机都能以16dp正确对齐图标 我会把这归因于安卓系统的碎片化,然后

我正在为一个应用程序实施一个可视化设计,结果发现Galaxy S4与actionbar home图标错位,如屏幕截图所示:

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

我试过一系列其他三星手机,它们的分辨率/密度不同(Galaxy S3、Galaxy S4 Mini、Galaxy Ace),所有这些手机都能以16dp正确对齐图标


我会把这归因于安卓系统的碎片化,然后继续前进,但Galaxy S4的市场份额如此之大,我真的不能忽视这个问题。有没有其他人遇到过这种情况,并找到了解决方法?

这段代码非常简单。它首先检查当前设备是否为三星Galaxy S4型号,基于。如果是,它将根据
操作栏的布局和
主页
图像视图在层次结构中的相对位置查找相关的
视图。然后通过(正)
offset
参数将它们向左移动。它还检查是否显示自定义的
视图
,并将其移动。唯一的更改是
视图
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
    }
}

通过4.4.2更新确认了Galaxy S3上的相同问题。真的很烦人。这可能是你的风格有问题,
ActionBar
在这方面有时会有点棘手,但很可能是三星把
ActionBar
搞砸了。首先,我要测试一个负边距是否能解决问题。如果操作系统版本有,Sherlock会委托“本机”操作栏。只是想一想:如果有人有根S3/S4,也许比较视图层次结构可以提供一些见解。即,层次结构是否存在任何差异?如果没有,那么各种视图属性值如何?或者,确定定制ROM是否存在同样的问题可能会很有趣?我不明白为什么每个人都在评论S4上没有出现这种情况。我真的很希望能找到解决办法,但我看到S4上的每个应用程序都能做到这一点。我有一个摩托G,Nexus7和S4在我面前,只有S4的螺丝了。我想我必须保持这样。我更喜欢不那么直率的东西,但这是一个足够有效的解决办法。我必须让它更通用一点,因为不完全是星系S4的错位,所以我将尝试通过实际的X坐标与预期的X坐标来检测错位。有趣的是,我之前也写过类似的东西,但我尝试调整视图的布局参数,但无论是否使用requestLayout(),都无法使其工作。有时,调用setX()的简单方法显然更具说服力。最后,我们使用MaterialMenu开源库作为ActionBar中的自定义视图,完全避开了这个问题。