无法添加原因:屏幕横向跨度不匹配,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));
}
}
复制代码