如何实现仅支持1x1、2x2等正方形尺寸的Android App Widget?
解决Android App Widget仅允许正方形尺寸调整的方案
1. 通过Widget配置Activity拦截尺寸调整
当用户尝试调整Widget大小时,系统会触发配置Activity(需提前配置),你可以在这里强制修正尺寸为正方形:
- 在
appwidget-provider的xml文件中添加android:configure属性,关联自定义配置Activity。 - 在配置Activity中,通过
AppWidgetManager获取用户当前选择的单元格尺寸。 - 判断宽高对应的单元格数是否相等,若不等则强制将宽高统一为两者中的较大值(比如用户选2x1,就修正为2x2;选3x2则修正为3x3)。
- 最后调用
AppWidgetManager.updateAppWidget()方法应用修正后的尺寸配置。
2. 在AppWidgetProvider中强制修正尺寸
如果用户绕过配置界面调整尺寸,可在Widget的生命周期回调中检查并修正:
- 重写
AppWidgetProvider的onAppWidgetOptionsChanged()方法(该方法会在Widget尺寸变化时触发)。 - 通过
AppWidgetManager.getAppWidgetOptions(appWidgetId)获取当前尺寸参数,利用官方换算公式得到单元格数:单元格数 = (尺寸值 + 70) / 71。 - 若宽高单元格数不等,计算目标正方形尺寸,构建新的
Bundle设置修正后的宽高,再调用AppWidgetManager.updateAppWidgetOptions()更新。
3. 配合resizeMode优化调整体验
在appwidget-provider的xml中设置android:resizeMode="horizontal|vertical",允许双向调整的同时,配合上述两种方法实现强制正方形:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="70dp" android:minHeight="70dp" android:targetCellWidth="1" android:targetCellHeight="1" android:resizeMode="horizontal|vertical" android:configure="com.yourpackage.YourWidgetConfigActivity" ...> </appwidget-provider>
注意:不同Launcher对Widget尺寸的处理存在差异,建议在主流Launcher(如Pixel Launcher、三星One UI等)上测试兼容性。
内容的提问来源于stack exchange,提问作者Cetin Yilmaz
相关产品推荐
相关产品推荐

