2015-02-10 74 views
2

其他几个人已经发现,在银河S3S调整的AppWidget时OnAppWidgetOptionsChanged不会被调用,而解决办法是捕捉的onReceive的com.sec.android.widgetapp.APPWIDGET_RESIZE如下所述:银河S3和AppWidgets:OnAppWidgetOptionsChanged最小和最大尺寸

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

中,然后设置这些成捆作为值OPTION_APPWIDGET_MIN_HEIGHTOPTION_APPWIDGET_MIN_WIDTH,然后将它们传递给对OnAppWidgetOptionsChanged的调用。

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

对于肖像,宽度为OPTION_APPWIDGET_MIN_WIDTH,高度为OPTION_APPWIDGET_MAX_HEIGHT

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

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

是否有实现这一意图可能对应于这些最小值和最大值的任何其他值,或者是widgetspanxwidgetspany唯一的整数值可用?

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

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

回答

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具有相同的纵横比。

因此,我可以使用S5单元尺寸以DIP为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); 
     } 
    } 
+0

谢谢!我也会在我的应用中使用这个解决方案。不幸的是我没有访问任何三星设备....我希望它会比使用“widgetSpanX * 74”方法更正确地工作。 – porlicus 2016-06-22 07:14:32