在Android Studio中,布局文件默认是按照文件名的字母顺序进行排序的,而不是按照文件所在的子文件夹排序。如果希望按照子文件夹排序布局文件,可以通过自定义布局文件排序规则来实现。
CustomLayoutSorter
:import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiManager;
import com.intellij.psi.impl.file.PsiDirectoryImpl;
import com.intellij.psi.impl.file.PsiDirectoryImplUtil;
import com.intellij.psi.impl.file.PsiDirectoryWrapper;
import com.intellij.psi.impl.file.PsiFileSystemItemImpl;
import com.intellij.psi.impl.file.impl.FileManagerImpl;
import com.intellij.psi.impl.file.impl.FileManagerImplUtil;
import com.intellij.psi.impl.file.impl.FileManagerImplUtil.DirectoryMergeRequest;
import com.intellij.psi.impl.file.impl.FileManagerImplUtil.PsiDirectoryRequest;
import com.intellij.psi.impl.file.impl.FileManagerImplUtil.SortablePsiDirectory;
import com.intellij.psi.impl.file.impl.FileManagerImplUtil.SortingData;
import com.intellij.psi.impl.file.impl.PsiDirectoryImplUtil;
import com.intellij.psi.impl.file.impl.PsiDirectoryImplUtil.PsiDirectoryComparator;
import com.intellij.psi.impl.file.impl.PsiDirectoryImplUtil.PsiDirectoryComparatorUtil;
import com.intellij.psi.impl.file.impl.PsiDirectoryImplUtil.PsiDirectoryWrapperWithViewProviderComparator;
import com.intellij.psi.impl.file.impl.PsiDirectoryImplUtil.PsiDirectoryWrapperWithVirtualFileComparator;
import com.intellij.psi.impl.file.impl.PsiDirectoryImplUtil.SubdirectoriesComparator;
import com.intellij.psi.util.PsiUtilCore;
import org.jetbrains.android.facet.AndroidFacet;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
public class CustomLayoutSorter {
public static void sortLayoutFiles(Project project, VirtualFile[] files) {
FileManagerImpl fileManager = (FileManagerImpl) PsiManager.getInstance(project).getFileManager();
PsiDirectory[] directories = Arrays.stream(files)
.map(file -> fileManager.findDirectory(file))
.toArray(PsiDirectory[]::new);
Arrays.sort(directories, new CustomComparator(project));
for (int i = 0; i < directories.length; i++) {
files[i] = directories[i].getVirtualFile();
}
}
private static class CustomComparator implements Comparator {
private final Project project;
private final PsiDirectoryComparator psiDirectoryComparator;
public CustomComparator(Project project) {
this.project = project;
psiDirectoryComparator = PsiDirectoryImplUtil.getComparator(project);
}
@Override
public int compare(PsiDirectory o1, PsiDirectory o2) {
if (o1 instanceof PsiDirectoryImpl && o2 instanceof PsiDirectoryImpl) {
return comparePsiDirectoryImpl((PsiDirectoryImpl) o1, (PsiDirectoryImpl) o2);
}
return psiDirectoryComparator.compare(o1, o2);
}
private int comparePsiDirectoryImpl(PsiDirectoryImpl dir1, PsiDirectoryImpl dir2) {
AndroidFacet facet1 = AndroidFacet.getInstance(dir1);
AndroidFacet facet2 = AndroidFacet.getInstance(dir2);
if (facet1 != null && facet2 != null && facet1.equals(facet2)) {
if (facet1.isManifestFile(dir1.getVirtualFile())) {
return -1;
}
if (facet2.isManifestFile(dir2.getVirtualFile())) {
return 1;
}
}
return psiDirectoryComparator.compare(dir1, dir2);
}
}
}
com.intellij.openapi.project.ex.ProjectManagerListener
的实现类中添加排序逻辑。例如,在com.intellij.openapi.components.impl.stores.BatchUpdateListener
中添加以下代码:import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ex.ProjectManagerListener;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
public class CustomLayoutSorterListener implements ProjectManagerListener {
@Override
public void projectOpened(@NotNull Project project) {
project.getMessageBus().connect().subscribe(VirtualFileManager.VFS_CHANGES, new VirtualFileAdapter() {
@Override
public void contentsChanged(@NotNull VirtualFileEvent event) {
VirtualFile file = event.getFile();
if (file != null && file.getParent() != null && file.getParent().isDirectory()) {
VirtualFile[] children = file.getParent().getChildren();
if (children != null && children.length > 0 && children[0].isDirectory()) {