如何定制Launcher主菜单中应用程序的显示顺序

需求:Launcher主菜单中某些应用程序必须放在最前面的几个位置,且顺序是固定的,切换预研等操作也不能更改其顺序。

修改方案:编辑Launcher2/res/xml/default_toppackage.xml文件

    <app
        launcher:topPackageName="com.yahoo.mobile.client.android.odp"
        launcher:topClassName="com.yahoo.mobile.client.android.odp.YahooODP"
        launcher:topOrder="4"
 	/>
 	
    <app
        launcher:topPackageName="com.yahoo.mobile.client.android.im"
        launcher:topClassName="com.yahoo.mobile.client.android.im.YahooMessenger"
        launcher:topOrder="5"
 	/> 
类似文件中的写法,填写你的应用的包名和class name,以及希望它显示的顺序(最小为0)


分析:下面来简单分析在代码中是如何实现的。

AllAppsList.java类中有个静态类TopPackage,非常简单的类,只有三个成员变量和一个构造方法,用来存储default_toppackage.xml文件中配置的一项:

static class TopPackage {
    public TopPackage(String pkgName, String clsName, int index) {
        packageName = pkgName;
        className = clsName;
        order = index;
    }

    String packageName;
    String className;
    int order;
}

AllAppsList.java类中有个静态变量sTopPackages,用来存储所有在default_toppackage.xml文件中的配置:

static ArrayList<TopPackage> sTopPackages = null;

有个静态方法负责解析这个xml文件,并把信息保存到sTopPackages中:

static boolean loadTopPackage(final Context context)

在LauncherModel.java的startLoader方法中调用AllAppsList.loadTopPackage(mApp)来解析xml文件。

解析后的使用是在

public void reorderApps() {
    if (LauncherLog.DEBUG) {
        LauncherLog.d(TAG, "reorderApps: mApps = " + mApps + ", this = " + this);
    }
    if (AllAppsList.sTopPackages == null || mApps == null || mApps.isEmpty()
            || AllAppsList.sTopPackages.isEmpty()) {
        return;
    }

    ArrayList<ApplicationInfo> dataReorder = new ArrayList<ApplicationInfo>(
            AllAppsList.DEFAULT_APPLICATIONS_NUMBER);

    for (AllAppsList.TopPackage tp : AllAppsList.sTopPackages) {
        for (ApplicationInfo ai : mApps) {
            if (ai.componentName.getPackageName().equals(tp.packageName)
                    && ai.componentName.getClassName().equals(tp.className)) {
                mApps.remove(ai);
                dataReorder.add(ai);
                break;
            }
        }
    }

    for (AllAppsList.TopPackage tp : AllAppsList.sTopPackages) {
        int newIndex = 0;
        for (ApplicationInfo ai : dataReorder) {
            if (ai.componentName.getPackageName().equals(tp.packageName)
                    && ai.componentName.getClassName().equals(tp.className)) {
                newIndex = Math.min(Math.max(tp.order, 0), mApps.size());
                mApps.add(newIndex, ai);
                break;
            }
        }
    }
}

在AppsCustomizePagedView.java的setApps、addApps、removeApps和updateApps方法中都会调用reorderApps来重新修改mApps中存储的各应用的顺序,当然,应该是在正常的排序结束后才根据你的配置重新再排序:

private ArrayList<ApplicationInfo> mApps;

private ArrayList<ApplicationInfo> mApps;

Collections.sort(mApps, LauncherModel.getAppNameComparator());
reorderApps();

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值