Launcher3 概述模式下单击无法添加小部件,长按拖动却可以

416 阅读1分钟

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