最近在修改android6.0的源码,其中Launcher3中跟5.1有所改变,判断显示所有app的代码,突然在Hotseat中找不到了,修改桌面上默认应用的布局也不起作用,哪位大神修改过请指教。

解决方案 »

  1.   

    告诉你一个工具去找。
    在SDK里面有一个hierarchyviewer的工具,一般是在sdk的tools目录里面。
    你用这个连接上设备,然后可以定位到代码。
    如果不会操作再说
      

  2.   

    楼主,求助!SOS
      

  3.   

    hotseat里面resetlayout里面判断是否显示 然后你对应的xml也要修改一下 
      

  4.   

        第一个问题我最近也在弄,我的解决办法比较原始,大概说一下,先找到LauncherModel类的LoderTask内部类,然后在run方法中做修改,在方法中的LoadAndBindWorkspace()方法和LoadAndBindWorkspace()方法执行后,添加如下代码和方法:                .......(run方法中)
                    // second step
                    if (DEBUG_LOADERS) Log.d(TAG, "step 2: loading all apps");
                    loadAndBindAllApps();                SharedPreferences sp = Launcher.msp;  //在Launcher.java中添加的静态SharedPreferences 
                    int appNum = mBgAllAppsList.size();
                    if(sp.getBoolean("isfirst",true)){
                        addScreenAndAddItem(appNum);
                        updateWorkspaceScreenOrder(mContext,loadWorkspaceScreensDb(mContext));
                        forceReload();
                        SharedPreferences.Editor editor = sp.edit();
                        editor.putBoolean("isfirst",false);
                        editor.commit();
                    }
                }
                ......(run方法中)
                
            public void addScreenAndAddItem(int appNum){
                int screenNum = (int)Math.ceil((double)appNum/30);  //这里的30是一个workspace桌面能承载的最大app数量,我改的是平板5x6界面所以是30个,这个数量可以在一个地方获得,我还没整理好偷懒直接写了
                ContentResolver cr = mContext.getContentResolver();
                Uri uri = LauncherSettings.WorkspaceScreens.CONTENT_URI;  //获取访问数据库的uri
                int startNum = 0;
                for(int i =1;i<=screenNum;i++) {  //这部分算法写的比较拙略,总之就是向不同屏幕id添加app信息
                    int addNum = appNum-30 >= 0 ? 30 : appNum+30*(i-1);
                    ContentValues v = new ContentValues();
                    v.put(LauncherSettings.WorkspaceScreens._ID, i);
                    v.put(LauncherSettings.WorkspaceScreens.SCREEN_RANK, i-1);
                    cr.insert(uri,v);
                    additem(addNum,startNum,i);
                    appNum = appNum - 30;
                    startNum = addNum;
                }
            }
            public void additem(int appNum,int startNum,int screen){
                int y = 0;
                for(int i=startNum;i<appNum;i++){
                    ShortcutInfo shortcutInfo = new ShortcutInfo(mBgAllAppsList.get(i));
                    addItemToDatabase(mContext,shortcutInfo,-100,screen,i%6,y);
                    if(i%6==5) {
                        y++;
                    }
                }
            }
    大致原理是让系统先将所有app信息读出来存放在mBgAllAppsList中,然后将mBgAllAppsList中取出的AppInfo对象转换成ShortCutInfo对象,然后调用addItemToDatabase方法将所有app信息存入保存桌面workspace信息的数据库中的favourite表中,然后执行forceReload()方法重新加载所有数据即可将app全部从数据库中读出显示在workspace桌面上。
        第二个问题,对于默认Hotseat的修改,只需要去res/xml路径下找到dw_phone(或者tablet)_hotseat.xml中修改resolve标签内的内容即可。