Android Launcher 3はアプリケーションをインストールした後、アプリケーションアイコンの表示位置を制御します
3042 ワード
最近AndroidのLauncher開発をしていて、アプリリストを削除すると、アプリアイコンをインストールするたびに2ページ目になります.ソースコードを確認すると、インストールアプリケーションはLauncherModelのaddAndBindAddedWorkspaceAppsメソッドを実行し、ワークスペースにバインドされたアプリケーションアイコンを追加します.
一方、addAndBindAddedWorkspaceAppsメソッドは、findNextavailableIconSpaceメソッドを使用して、空の場所格納アプリケーションアイコンを探します.ここで見つからないと、ページ数++になります.
findNextavailableIconSpaceメソッドでは、Launcherの2番目のページから常に空の位置を探していることに気づきました.だから私はこの方法を修正して、彼に最初のページから探させました.これにより、アプリケーションをインストールした後、アイコンの配置位置を適用する問題が完璧に解決されます.
public void addAndBindAddedWorkspaceApps(final Context context,
final ArrayList workspaceApps) {
一方、addAndBindAddedWorkspaceAppsメソッドは、findNextavailableIconSpaceメソッドを使用して、空の場所格納アプリケーションアイコンを探します.ここで見つからないと、ページ数++になります.
// Add this icon to the db, creating a new page if necessary. If there
// is only the empty page then we just add items to the first page.
// Otherwise, we add them to the next pages.
int startSearchPageIndex = workspaceScreens.isEmpty() ? 0 : 1;
Pair coords = LauncherModel.findNextAvailableIconSpace(context,
name, launchIntent, startSearchPageIndex, workspaceScreens);
findNextavailableIconSpaceメソッドでは、Launcherの2番目のページから常に空の位置を探していることに気づきました.だから私はこの方法を修正して、彼に最初のページから探させました.これにより、アプリケーションをインストールした後、アイコンの配置位置を適用する問題が完璧に解決されます.
static Pair findNextAvailableIconSpace(Context context, String name,
Intent launchIntent,
int firstScreenIndex,
ArrayList workspaceScreens) {
// Lock on the app so that we don't try and get the items while apps are being added
LauncherAppState app = LauncherAppState.getInstance();
LauncherModel model = app.getModel();
boolean found = false;
synchronized (app) {
if (sWorkerThread.getThreadId() != Process.myTid()) {
// Flush the LauncherModel worker thread, so that if we just did another
// processInstallShortcut, we give it time for its shortcut to get added to the
// database (getItemsInLocalCoordinates reads the database)
model.flushWorkerThread();
}
final ArrayList items = LauncherModel.getItemsInLocalCoordinates(context);
// Try adding to the workspace screens incrementally, starting at the default or center
// screen and alternating between +1, -1, +2, -2, etc. (using ~ ceil(i/2f)*(-1)^(i-1))
//
firstScreenIndex = Math.min(firstScreenIndex, workspaceScreens.size());
int count = workspaceScreens.size();
firstScreenIndex = firstScreenIndex >= 1 ? firstScreenIndex - 1 : firstScreenIndex;
for (int screen = firstScreenIndex; screen < count && !found; screen++) {
int[] tmpCoordinates = new int[2];
if (findNextAvailableIconSpaceInScreen(items, tmpCoordinates,
workspaceScreens.get(screen))) {
// Update the Launcher db
return new Pair(workspaceScreens.get(screen), tmpCoordinates);
}
}
}
return null;
}