无法添加原因:屏幕横向跨度不匹配,findCellForSpan()方法return false; 在com.android.launcher3.widget.WidgetsPagedView类的onClick方法中点击添加小部件:
@Override public void onClick(View v) { if (!mLauncher.isWidgetsViewVisible() || mLauncher.getWorkspace().isSwitchingState() || !(v instanceof WidgetCell)) return; if (v.getTag() instanceof ItemInfo) { ItemInfo info = (ItemInfo) v.getTag(); mLauncher.getWorkspace().onWidgetCellClick(info,(WidgetCell)v); } }复制代码
进入onWidgetCellClick方法,问题出在这句代码
if(!dropTargetLayout.findCellForSpan(mTargetCell,minSpanX,minSpanY))复制代码
表现为组件ItemInfo的属性spanX的值,和其属性类型为 LauncherAppWidgetProviderInfo的属性spanX的值,大于我们设备默认跨度.比如当组件spanX=5,而我们设备spanX为4时,此组件就不会添加成功.
解决方法:通过上述代码可以发现ItemInfo是通过v.getTag()强制类型转换而来的,那么必然有v.setTag().我们在setTag时,传入修改后的对象,以达到适配屏幕宽度,成功添加组件的目的.
调试发现settag方法在com.android.launcher3.widget.WidgetCell的applyFromCellItem()中.修改如下:
public void applyFromCellItem(WidgetItem item, WidgetPreviewLoader loader) { 代码省略.... if (item.activityInfo != null) { setTag(new PendingAddShortcutInfo(item.activityInfo)); } else { //add by dx for Widths do not match and components cannot be added start mItem.widgetInfo.spanX =hSpan; mItem.widgetInfo.spanY=vSpan; //add by dx end //设置小部件信息 setTag(new PendingAddWidgetInfo(mLauncher, item.widgetInfo)); } }复制代码