Android Galaxy s3和AppWidgets:OnAppWidgetOptions更改了最小和最大维度

Android Galaxy s3和AppWidgets:OnAppWidgetOptions更改了最小和最大维度,android,android-widget,Android,Android Widget,其他一些人发现,在Galaxy S3s上调整AppWidget的大小时,不会调用OnAppWidgetOptions Changed,解决方法是在onReceive中捕获com.sec.android.widgetapp.AppWidget\u RESIZE,如下所述: 在这种方法中,他们从接收到的意图中获得小部件的高度和宽度: int widgetSpanX = intent.getIntExtra("widgetspanx", 0); int widgetSpanY = intent.

其他一些人发现,在Galaxy S3s上调整AppWidget的大小时,不会调用OnAppWidgetOptions Changed,解决方法是在onReceive中捕获
com.sec.android.widgetapp.AppWidget\u RESIZE
,如下所述:

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

 int widgetSpanX = intent.getIntExtra("widgetspanx", 0);
 int widgetSpanY = intent.getIntExtra("widgetspany", 0);
然后将这些设置为一个Bundle,作为OPTION\u APPWIDGET\u MIN\u HEIGHTOPTION\u APPWIDGET\u MIN\u WIDTH的值,然后将它们传递给OnAppWidgetOptions Changed的调用

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

对于纵向,宽度为OPTION\u-APPWIDGET\u-MIN\u-width,高度为OPTION\u-APPWIDGET\u-MAX\u-height

对于横向,宽度为OPTION\u-APPWIDGET\u-MAX\u-width,高度为OPTION\u-APPWIDGET\u-MIN\u-height

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

该意图中是否有任何其他值可能对应于这些最小值和最大值,或者widgetspanx和widgetspany是唯一可用的整数值

或者当您将主屏幕模式从纵向更改为横向时,s3是否提供另一个具有不同值的
com.sec.android.widgetapp.APPWIDGET\u RESIZE
事件


不幸的是,我没有访问S3的权限来检查自己的意图

好的,我找到了一个解决办法

我仍然无法访问S3,因此看不到在
com.sec.android.widgetapp.APPWIDGET_RESIZE
intent中还有什么其他内容,但我怀疑Touchwiz只会提供跨越每个维度的单元数,而不是实际的像素边界

这意味着我必须从这里调整
handleTouchWiz
功能:

并且我自己明确地设置了最小和最大范围

事实证明,三星Galaxy S5(我有)与S3具有相同的屏幕纵横比,只是成比例地增大,幸运的是,S5主屏幕小部件单元大小也与S3具有相同的纵横比

因此,我可以使用S3的S5单元尺寸(以倾角表示):

  • 在纵向图中,一个单元格为88*107
  • 在景观中,一个单元是143*64倾角
现在,其他发射器可能在单元大小上略有变化,特别是如果他们将单元网格自定义为5x6,而不是标准的Touchwiz 4x4,但对我来说,它足够精确

因此,下面的工作很好,允许我在对
onappwidgetoptionchanged
的调用中导出一个相当准确的小部件纵横比

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);
        }
    }

非常感谢。我也将在我的应用程序中使用此解决方案。不幸的是,我没有访问任何三星设备。。。。我希望它能比使用“widgetSpanX*74”方法更正确地工作。