我正在开发一个 Android 文件管理应用程序,用户可以在其中上传、下载文件并将文件组织到文件夹中。目前,我已经实现了基本的文件和文件夹功能。现在,我想扩展应用程序以支持嵌套文件夹,允许用户在其他文件夹内创建文件夹。
我使用firebase数据库和java语言以及android studio
public void createFolder() {
// Create a Dialog object
Dialog dialog = new Dialog(this);
// Set the content view of the dialog by inflating folder_dialog.xml
View dialogView = LayoutInflater.from(this).inflate(R.layout.folder_dialog, null);
dialog.setContentView(dialogView);
// Now, you can find and use the views inside the dialogView
EditText folderNameEditText = dialogView.findViewById(R.id.FolderName);
Button createFolderBtn = dialogView.findViewById(R.id.CreateFolderBtn);
// Set click listener for the create folder button
createFolderBtn.setOnClickListener(v -> {
String folderName = folderNameEditText.getText().toString().trim();
// Perform folder creation logic here
if (!folderName.isEmpty()) {
DatabaseReference foldersRef = FirebaseDatabase.getInstance().getReference().child("folders").child(currentUserId);
// Generate a unique key for the folder
String folderId = foldersRef.push().getKey();
// Store folder metadata in the Realtime Database
FolderMetadata folderMetadata = new FolderMetadata(folderId, folderName);
// Save folder metadata using the unique key
foldersRef.child(folderId).setValue(folderMetadata)
.addOnSuccessListener(aVoid -> {
// Folder created successfully
StyleableToast.makeText(FolderActivity.this, "Folder created successfully", Toast.LENGTH_SHORT, R.style.mytoast).show();
dialog.dismiss(); // Dismiss the dialog after creating the folder
})
.addOnFailureListener(e -> {
// Folder creation failed
StyleableToast.makeText(FolderActivity.this, "Folder creation failed", Toast.LENGTH_SHORT, R.style.mytoast).show();
});
} else {
folderNameEditText.setError("Please enter a folder name");
}
});
// Show the dialog
dialog.show();
}
当我想在用户的主帐户(即根目录)中创建一个文件夹时,我编写了这些代码,但现在我不知道如何获取父文件夹ID,以便我可以在彼此内部创建文件夹.
一开始,我创建了一个名为FolderActivity的新类,以便我可以显示我创建的文件夹内的文件和文件夹。
我之前创建的 CreateFolder 方法是在 Home 类上,所以我创建了一个对象以便我可以使用它,但是当我按下“创建文件夹”按钮时,它会将我带出页面并带我到主页,所以我复制了创建文件夹方法并将其写入FolderActivity类中,现在当我按下创建文件夹按钮时。出现一个对话框,我可以在其中输入文件夹的名称。当我创建并写入文件夹名称时,它会将其保存在用户的主文件夹中,即根文件夹中,而不是我单击的文件夹中。
为了支持嵌套文件夹,您需要修改数据结构和逻辑来处理文件夹之间的父子关系。在您当前的实现中,您似乎将文件夹直接存储在用户的 ID 节点下。相反,您可以创建一个更具层次结构的结构来表示嵌套文件夹。
这是
createFolder
方法的修改版本以及支持嵌套文件夹的一些其他更改:
// Instead of storing folders directly under the user's ID, represent a folder hierarchy
// For simplicity, I'm assuming a structure like "users" -> "userId" -> "folders" -> "folderId"
DatabaseReference foldersRef = FirebaseDatabase.getInstance().getReference()
.child("users")
.child(currentUserId)
.child("folders");
createFolder
方法。修改方法签名以包含父文件夹 ID:public void createFolder(String parentFolderId) {
// ... existing code
// Generate a unique key for the folder
String folderId = foldersRef.push().getKey();
// Store folder metadata in the Realtime Database
FolderMetadata folderMetadata = new FolderMetadata(folderId, folderName);
// Save folder metadata using the unique key
foldersRef.child(folderId).setValue(folderMetadata)
.addOnSuccessListener(aVoid -> {
// Folder created successfully
StyleableToast.makeText(FolderActivity.this, "Folder created successfully", Toast.LENGTH_SHORT, R.style.mytoast).show();
dialog.dismiss(); // Dismiss the dialog after creating the folder
})
.addOnFailureListener(e -> {
// Folder creation failed
StyleableToast.makeText(FolderActivity.this, "Folder creation failed", Toast.LENGTH_SHORT, R.style.mytoast).show();
});
}
createFolder
,请确保传递父文件夹 ID:// Example: When creating a folder inside another folder
String parentFolderId = "yourParentFolderId";
createFolder(parentFolderId);
createFolder
而不传递父文件夹 ID:// Example: When creating a folder in the root (main) folder
createFolder(null);
这样,您可以在创建新文件夹时通过指定父文件夹ID来创建文件夹的层次结构。相应地调整文件夹列表逻辑,以根据父子关系显示嵌套文件夹。