hi what's up!
我是博主illa!
今天给大家介绍一下在android O1版本 launcher3实现的 去掉应用抽屉!
思路:第一步要实现去掉应用抽屉首先需要让所有的icon加载到桌面上不然用户无法看到所有的app
第二步手动安装第三方app的时候需要add一个icon到桌面
第三步去掉原先allapp的入口以及o1版本上滑的那个箭头还有hotseat抖动
理清了思路做起来就比较顺手,其实app的信息主要是存储在一个ArrayList里面可以用
LauncherAppsCompat.getActivityList()得到而我们要做的就是遍历这个list得到没有被预置在桌面上的
应用信息并add到list里面再加载到桌面即可
首先在Launcher3\src\com\android\launcher3\model\LoaderTask.java
里的run方法中添加一个loadAllApplications()方法的调用,主要是循环遍历LauncherActivityInfo并通过
LauncherModel的addAndBindAddedWorkspaceItems()方法添加到桌面上,其中主要涉及的知识就是
循环遍历,代码如下
private void loadAllApplications() {
final Context context = mApp.getContext();
final List<UserHandle> profiles = mUserManager.getUserProfiles();
android.util.Log.e("gaoshifeng","111111111111111111111");
for (UserHandle user : profiles) {
final List<LauncherActivityInfo> apps = mLauncherApps.getActivityList(null, user);
android.util.Log.e("gaoshifeng","22222222222222222");
ArrayList<PendingInstallShortcutInfo> added = new ArrayList<PendingInstallShortcutInfo>();
synchronized (this) {
for (LauncherActivityInfo app : apps) {
PendingInstallShortcutInfo pendingInstallShortcutInfo = new PendingInstallShortcutInfo(app,context);
added.add(pendingInstallShortcutInfo);
android.util.Log.e("gaoshifeng","app ===== " + app);
android.util.Log.e("gaoshifeng","333333333333333333333");
}
}
if (!added.isEmpty()) {
android.util.Log.e("gaoshifeng","4444444444444444444444444");
mLauncherModel.addAndBindAddedWorkspaceItems(new LazyShortcutsProvider(context.getApplicationContext(), added));
}
}
}
当时在加上这段代码之后,桌面的iocn还是一直加载不出来,检查了很多遍代码之后,苦思不得其解,只好加log将加载
流程一个个打印看看哪里出了问题。最后发现在Launcher3\src\com\android\launcher3\model\BaseModelUpdateTask.java
的run方法中
if (!mModel.isModelLoaded()) {
if (DEBUG_TASKS) {
Log.d(TAG, "Ignoring model task since loader is pending=" + this);
}
// Loader has not yet run.
return;
}
这里return掉了。
怎么办呢,解决方法其实很简单,注释掉即可。
然后再把icon拖动时的删除给干掉
Launcher3\src\com\android\launcher3\DeleteDropTarget.java中
@Override
protected boolean supportsDrop(DragSource source, ItemInfo info) {
//add by gaoshifeng start
if (info instanceof ShortcutInfo) {
ShortcutInfo item = (ShortcutInfo) info;
return item.itemType != LauncherSettings.BaseLauncherColumns.ITEM_TYPE_APPLICATION;
}
return info instanceof LauncherAppWidgetInfo;
//return true;
//add by gaoshifeng end
}
到这里第一步基本已经完成了,接下来进行第二步。当安装apk时,将icon加载到桌面上。
安装apk时其实走的是Launcher3\src\com\android\launcher3\model\PackageUpdatedTask.java
所以我们在这个task的run方法里面加上相应处理即可,具体代码跟上面加载到桌面的方法大同小异
不过要注意加在added这个ArrayList之前被clear之前
addedOrModified.addAll(appsList.added);
//add by gaoshifeng start
final List<UserHandle> profiles = UserManagerCompat.getInstance(context).getUserProfiles();
ArrayList<PendingInstallShortcutInfo> added = new ArrayList<PendingInstallShortcutInfo>();
for (UserHandle user : profiles) {
final List<LauncherActivityInfo> apps = LauncherAppsCompat.getInstance(context).getActivityList(null, user);
android.util.Log.e("gaoshifeng","+++++++++++++++");
synchronized (this) {
for (LauncherActivityInfo info : apps) {
for (AppInfo appInfo : appsList.added) {
if(info.getComponentName().equals(appInfo.componentName)){
PendingInstallShortcutInfo mPendingInstallShortcutInfo = new PendingInstallShortcutInfo(info,context);
added.add(mPendingInstallShortcutInfo);
}
}
}
}
}
if (!added.isEmpty()) {
android.util.Log.e("gaoshifeng","------------------------");
app.getModel().addAndBindAddedWorkspaceItems(new LazyShortcutsProvider(context.getApplicationContext(), added));
}
//add by gaoshifeng end
appsList.added.clear();
第三步去掉原先allapp的入口以及o1版本上滑的那个箭头还有hotseat抖动
Launcher3\src\com\android\launcher3\allapps\AllAppsTransitionController.java
滑动事件在onDragStart以及onDrag的时候 return掉即可
每次进入桌面hotseat抖动,其实是用BounceInterpolator来写的只要将
Launcher3\src\com\android\launcher3\Launcher.java中onresume的
if (shouldShowDiscoveryBounce()) {
//mAllAppsController.showDiscoveryBounce();delete by gaoshifeng
}
delete掉即可
最后把箭头图标删除,
Launcher3/src/com/android/launcher3/pageindicators/PageIndicatorLineCaret.java 的 onFinishInflate()
add 以下这一行即可
mAllAppsHandle.setImageDrawable(null);
今天就到这里,希望以上代码可以对阅读者有所启发。我们来日方长!