Galaxy s3和AppWidgets:OnAppWidgetOptionsChanged最小和最大尺寸

时间:2015-02-10 10:34:40

标签: android android-widget

其他几个人发现在Galaxy S3上调整AppWidget大小时没有调用OnAppWidgetOptionsChanged,并且解决方法是捕获onReceive中的com.sec.android.widgetapp.APPWIDGET_RESIZE,如下所述:

How to catch widget size changes on devices where onAppWidgetOptionsChanged not getting called?

在这种方法中,他们从收到的意图中获得小部件的高度和宽度:

 int widgetSpanX = intent.getIntExtra("widgetspanx", 0);
 int widgetSpanY = intent.getIntExtra("widgetspany", 0);

然后将这些设置为Bundle,作为 OPTION_APPWIDGET_MIN_HEIGHT OPTION_APPWIDGET_MIN_WIDTH 的值,然后将它们传递给对OnAppWidgetOptionsChanged的调用。

现在,我遇到的问题是,通常的OnAppWidgetOptionsChanged回调为min 提供了其包中调整大小的小部件的最大尺寸,而不仅仅是min。这些值对应于窗口小部件的横向和纵向模式的尺寸:

对于Portrait,宽度为 OPTION_APPWIDGET_MIN_WIDTH ,高度为 OPTION_APPWIDGET_MAX_HEIGHT

对于横向,宽度为 OPTION_APPWIDGET_MAX_WIDTH ,高度为 OPTION_APPWIDGET_MIN_HEIGHT

最小和最大尺寸之间的差异可能非常大,因为景观单元覆盖的给定区域比纵向单元格更宽更短。我需要它们才能在两种模式下计算出小部件的实际宽高比。

该意图中是否存在可能与这些最小值和最大值相对应的其他值,或 widgetspanx widgetspany 唯一可用的整数值?

或者,当您将主屏幕模式从纵向更改为横向时,s3是否会为其他com.sec.android.widgetapp.APPWIDGET_RESIZE事件提供不同的值?

不幸的是,我无法访问S3以便能够自己检查意图。

1 个答案:

答案 0 :(得分:1)

好的,我找到了解决方法。

我仍然无法访问S3,因此无法看到com.sec.android.widgetapp.APPWIDGET_RESIZE意图中可能存在的其他内容,但我怀疑Touchwiz是否只提供跨越每个维度的单元格数量,而不是DIP中的实际像素界限。

这意味着我必须从这里调整handleTouchWiz函数:

How to catch widget size changes on devices where onAppWidgetOptionsChanged not getting called?

并自己在DIP中明确设置最小和最大范围。

事实证明,三星Galaxy S5(我拥有)具有与S3相同的屏幕宽高比,只是比例更大,幸运的是S5主屏幕小部件单元尺寸也具有与S3相同的宽高比。

所以我可以在DIP中使用S5单元尺寸来表示S3:

  • 在纵向中,单元格为88 * 107 DIP
  • 在横向中,单元格为143 * 64 DIP

现在其他发射器的单元尺寸可能略有不同,特别是如果他们将单元网格定制为5x6而不是标准的Touchwiz 4x4,但它对我来说足够准确。

因此,以下工作正常,允许我在调用OnAppWidgetOptionsChanged的结果调用中得出一个相当准确的小部件宽高比。

private void handleTouchWiz(Context context, Intent intent) 
    {
       // Toast.makeText(context, "Calling handleTouchWiz for Samsung S3", Toast.LENGTH_SHORT).show();
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

        int appWidgetId = intent.getIntExtra("widgetId", 0);
        int widgetSpanX = intent.getIntExtra("widgetspanx", 0);
        int widgetSpanY = intent.getIntExtra("widgetspany", 0);

        if(appWidgetId > 0 && widgetSpanX > 0 && widgetSpanY > 0) 
        {
            Bundle newOptions = new Bundle();
            // We have to convert these numbers for future use
            // For Portrait
            newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH, widgetSpanX * 88);
            newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT, widgetSpanY * 107);
            // For Landscape
            newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH, widgetSpanX * 143);
            newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT, widgetSpanY * 64);

            onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions);
        }
    }