不应用在ICS手机的Widget利润率拥有TouchWiz发射?利润率、不应、用在、手机

2023-09-06 06:30:15 作者:走路太骚会闪腰

我有一个小部件的应用程序。我知道Android 4.0或更高版本会自动创建一个围绕小部件的余量,所以我已经实现了对建议的这个开发者API页面使部件大致相同的大小不同的Andr​​oid版本。我测试过的部件在模拟器上的API 10,14和15并能正常工作。窗口小部件看起来在所有版本相同。然而,当我与Android 4.0.3测试它在我的SGS2的手机有没有空间!这是怎么回事?我在想什么?有没有其他人遇到这种情况?

I have an app with a widget. I know that Android 4.0 or later will automatically create a margin around the widget so I've implemented the suggestion on this developers API page to make the widgets approximately the same size on different Android versions. I've tested the widget in the emulator on API 10, 14 and 15 and it works fine. The widget looks the same in all versions. However, when I test it on my SGS2 phone with Android 4.0.3 there are no margins! How can this be? What am I missing? Did anyone else experience this behaviour?

!

下面是我的 RES / XML / widget_info.xml

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 

    android:initialLayout="@layout/widget"    
    android:minHeight="40dp"  
    android:minWidth="110dp"
    android:updatePeriodMillis="60000" >

</appwidget-provider>

RES /布局/ widget.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/widget_mainlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:layout_margin="@dimen/widget_margin"
    android:background="@drawable/widget_background" >             
</RelativeLayout>

RES /绘制/ widget_background.xml

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

<stroke
    android:width="2dp"
    android:color="#222222" />

<gradient
    android:angle="225"
    android:startColor="#DD2ECCFA"
    android:endColor="#DD000000" />

<corners android:radius="7dp" />

</shape>

RES /价值/ dimens.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="widget_margin">8dp</dimen>
</resources>

RES /值-V14 / dimens.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="widget_margin">0dp</dimen>  
</resources>

起初我以为它必须是与没有被正确地更新这里描述小部件,但在取出窗口小部件,然后重新添加它并不能帮助。我也尝试了一下与设置:

At first I thought it had something to do with the widget not being properly updated as described here, but removing the widget and adding it again doesn't help. I've also experimented a bit with the settings:

设置了maxHeight 了maxWidth widget_info.xml 文件不起作用,这似乎是由两个仿真器和手机被忽略。 更改 layout_margin 填充 widget.xml 文件没有任何效果,插件看起来是一样的(但在仿真器API10部件现在还没有利润) 更改 0dp 16DP RES /值-V14 /梦诗。 XML 文件确实有在手机和模拟器的效果,但电话和模拟器仍然在物件的尺寸是不同的。 Setting maxHeight and maxWidth in the widget_info.xml file doesn't work, it seems to be ignored by both the emulator and the phone. Changing layout_margin to padding in the widget.xml file has no effect, widget looks the same (but on emulator API10 widget now also has no margins) Changing the 0dp to 16dp in the res/values-v14/dimens.xml file does have an effect in both the phone and the emulator, but the widget's size on the phone and emulator still is different.

编辑: 我已经安装在手机上的GO桌面EX,然后在窗口小部件确实有利润,所以我想这是对三星的TouchWiz发射一个具体问题?任何人都可以证实这一点?我也有兴趣的解决方案使用的TouchWiz时,使部件看起来(或多或少)是一样的。

I've installed GO Launcher Ex on the phone and then the widget does have margins, so I guess this is a specific issue for Samsung's TouchWiz launcher? Can anyone confirm this? I am also interested in solutions to make the widget look (more or less) the same when using TouchWiz.

推荐答案

正如你已经指出的,关键是要使用不同的利润率/填充的TouchWiz的设备或SDK级&LT; 14.对于SDK级&LT; 14,你应该继续使用dimens.xml,但对的TouchWiz你需要创建一个单独的布局文件。

As you already pointed out, the trick is to use different margins/padding for TouchWiz devices or SDK level < 14. For SDK level < 14 you should continue to use dimens.xml, but for TouchWiz you'll need to create a separate layout file. Then if you detect TouchWiz, you switch the layout file in the constructor of the widget RemoteViews:

RemoteViews views = new RemoteViews(
    context.getPackageName(), 
    isAlternativeMargins(context) ? 
        R.layout.alternative_layout : 
        R.layout.normal_layout
)

要检测的TouchWiz并具有相同问题的其他发射器,你可以使用下面的code:

To detect TouchWiz and other launchers having the same problem, you could use the following code:

/* sorted alphabetically to be able to use Arrays.binarySearch later on */
private final static String[] LAUNCHER_ALTERNATIVES = {
    "com.sec.android.app.launcher",
    "com.sec.android.app.twlauncher",
};

private final static String[] LAUNCHER_ALTERNATIVE_EXCEPTIONS = {
    "GT-I9100", // Galaxy S II
    "GT-I9100G", // Galaxy S II
    "GT-I9100T", // Galaxy S II
    "GT-I9210T", // Galaxy S II
    "GT-I9100M", // Galaxy S II
    "SGH-I757M", // Galaxy S II
    "SGH-I727R", // Galaxy S II
    "SGH-I927", // Galaxy S II
    "SGH-T989D", // Galaxy S II
    "GT-I9108", // Galaxy S II
    "GT-I9100P", // Galaxy S II
    "ISW11SC", // Galaxy S II
    "SC-02C", // Galaxy S II
    "SHW-M250K", // Galaxy S II
    "SHW-M250L", // Galaxy S II
    "SHW-M250S", // Galaxy S II
    "SGH-I777", // Galaxy S II
    "SGH-I727", // Galaxy S II
    "SGH-I927", // Galaxy S II
    "SPH-D710", // Galaxy S II
    "SGH-T989", // Galaxy S II
    "SCH-R760", // Galaxy S II
    "GT-N7000", // Galaxy Note
    "SHV-E160K", // Galaxy Note
    "SHV-E160L", // Galaxy Note
    "SHV-E160S", // Galaxy Note
    "SGH-I717", // Galaxy Note
    "SC-05D", // Galaxy Note
    "SGH-T879", // Galaxy Note
    "GT-I9220", // Galaxy Note
    "GT-I9228", // Galaxy Note
    "SCH-I889", // Galaxy Note
    "SGH-I717", // Galaxy Note
};

static {
    Arrays.sort(LAUNCHER_ALTERNATIVE_EXCEPTIONS);
}


public static boolean isAlternativeMargins(Context context) {
    if (Build.VERSION.SDK_INT < 14)
        return false;

    PackageManager pm = context.getPackageManager();
    Intent i = new Intent(Intent.ACTION_MAIN);
    i.addCategory(Intent.CATEGORY_HOME);
    i.addCategory(Intent.CATEGORY_DEFAULT);

    ResolveInfo info = pm.resolveActivity(i, PackageManager.MATCH_DEFAULT_ONLY);

    if (
            info != null && info.activityInfo != null && 
            info.activityInfo.taskAffinity != null
    ) {
        int pos = Arrays.binarySearch(
                LAUNCHER_ALTERNATIVES, info.activityInfo.taskAffinity
        );

        // if TouchWiz
        if (pos >= 0) {
            // if >= Android 4.1.2 and (Galaxy S II or Galaxy Note) 
            if ( getSdk() >= 16 && Arrays.binarySearch(
                    LAUNCHER_ALTERNATIVE_EXCEPTIONS, Build.MODEL
            ) >= 0)
                return false;

            return true;
        }
    }
    return false;
}

在code以上检测到默认发射并返回true,如果是的TouchWiz。

The code above detects the default launcher and returns true, if it is TouchWiz.

修改:修改了,似乎有同样的问题的TouchWiz额外的发射

修改2:修改为Android 4.1.2的Galaxy S II和Galaxy Note的地方小部件利润率按预期方式工作。相反在Galaxy S的3采用Android 4.1.2,他们并不如预期,这将可能改变三星未来的TouchWiz版本。

 
精彩推荐
图片推荐