如何获取应用程序小部件的大小?

7

我有一个Android应用程序小部件,我希望将其扩展为支持多种大小,并且在Honeycomb上可以重新调整大小。

问题是我需要知道小部件的大小,以便我知道可以放置多少内容。

我该如何读取应用程序小部件的大小?

我找不到任何相关信息。

1个回答

16

我知道这是一个老问题,但现在有一个更新的答案(我认为它在当时还不可用,因为它仅适用于API 16及以上版本):

你可以调用:

Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetId);

这将给您的接收器传递的选项相同的选择。

public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions)

使用此Bundle选项,您可以使用常量查询大小:

AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT
AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH
AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT
AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH

记住三星喜欢与众不同,所以您可能需要一个专门为TouchWiz定制的处理程序(以下代码直接从我的应用程序中复制):

@Override
public void onReceive(Context context, Intent intent) {
  if (intent == null || intent.getAction() == null)
     return;
  // I FUCKING HATE SAMSUNG!
  if (intent.getAction().contentEquals("com.sec.android.widgetapp.APPWIDGET_RESIZE") &&
     Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
     handleTouchWiz(context, intent);
  }
  super.onReceive(context, intent);
}

@TargetApi(16)
private void handleTouchWiz(Context context, Intent intent) {
  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
     newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT, widgetSpanY * 74);
     newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH, widgetSpanX * 74);

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

1
你是怎么想出 widgetSpan * 74 这个值的?只是试错吗?你知道 max_height 的神奇数字是多少吗? - Nathan Schwermann
抱歉,handleTouchWiz函数是从其他SO答案中直接复制的,我不知道它的来源。 - Budius
刚在Galaxy S6上进行了测试,意图从未被接收,但onAppWidgetOptionsChanged被调用并带有有效参数,因此三星似乎已经解决了这个问题。 - joe1806772
在平板电脑上尝试时,我刚刚注意到它不会在方向更改时触发。即使您强制使用重新调整大小来触发它,值似乎也是错误的(与纵向相同)。 - Mario Lenci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接