三星Galaxy S4未对准Actionbar图标

Bar*_*end 19 android android-actionbar

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

在此输入图像描述

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

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

我会把它归结为Android碎片并继续前进,但Galaxy S4的市场份额是如此之大,以至于我无法忽视这个问题.有没有其他人遇到这个,并找到了修复?

Mik*_* M. 2

这段代码非常不言自明。它首先根据此处找到的列表检查当前设备是否为 Samsung Galaxy S4 型号。如果是,则它会View根据 的ActionBar布局和home ImageView层次结构中的相对位置查找相关的 。然后将它们向左移动(正)offset参数。它还检查是否View显示自定义,并对其进行更改。唯一的变化是Viewsx坐标,因此它应该适用于任何主题或风格。

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
    }
}
Run Code Online (Sandbox Code Playgroud)