diff --git a/src/Notesmaster/app/src/main/java/net/micode/notes/MainActivity.java b/src/Notesmaster/app/src/main/java/net/micode/notes/MainActivity.java
index df300de..930f6fe 100644
--- a/src/Notesmaster/app/src/main/java/net/micode/notes/MainActivity.java
+++ b/src/Notesmaster/app/src/main/java/net/micode/notes/MainActivity.java
@@ -1,24 +1,33 @@
package net.micode.notes;
+import android.content.Intent;
import android.os.Bundle;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.View;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
+import androidx.drawerlayout.widget.DrawerLayout;
+import net.micode.notes.data.Notes;
import net.micode.notes.ui.SidebarFragment;
/**
* 主活动类
*
- * 应用的主入口,负责初始化主界面并处理窗口边距。
+ * 应用的主入口,负责启动笔记列表界面
* 支持边到边显示模式,自动适配系统栏的边距。
*
*/
public class MainActivity extends AppCompatActivity implements SidebarFragment.OnSidebarItemSelectedListener {
+ private static final String TAG = "MainActivity";
+ private DrawerLayout drawerLayout;
+
/**
* 创建活动
*
@@ -33,6 +42,37 @@ public class MainActivity extends AppCompatActivity implements SidebarFragment.O
// 启用边到边显示模式
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
+
+ // 初始化DrawerLayout
+ drawerLayout = findViewById(R.id.drawer_layout);
+ if (drawerLayout != null) {
+ // 设置侧栏在左侧
+ drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, Gravity.LEFT);
+
+ // 设置监听器:侧栏关闭时更新状态
+ drawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() {
+ @Override
+ public void onDrawerSlide(View drawerView, float slideOffset) {
+ // 侧栏滑动时
+ }
+
+ @Override
+ public void onDrawerOpened(View drawerView) {
+ // 侧栏打开时
+ }
+
+ @Override
+ public void onDrawerClosed(View drawerView) {
+ // 侧栏关闭时
+ }
+
+ @Override
+ public void onDrawerStateChanged(int newState) {
+ // 侧栏状态改变时
+ }
+ });
+ }
+
// 设置窗口边距监听器,自动适配系统栏
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main_content), (v, insets) -> {
// 获取系统栏边距
@@ -41,19 +81,26 @@ public class MainActivity extends AppCompatActivity implements SidebarFragment.O
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
+
+ // 启动NotesListActivity作为主界面
+ Intent intent = new Intent(this, net.micode.notes.ui.NotesListActivity.class);
+ startActivity(intent);
}
// ==================== SidebarFragment.OnSidebarItemSelectedListener 实现 ====================
@Override
public void onFolderSelected(long folderId) {
- // TODO: 实现跳转到指定文件夹
- // 关闭侧栏
+ Log.d(TAG, "Folder selected: " + folderId);
+ // 打开侧栏中的文件夹:不关闭侧栏,直接切换视图
+ // 这个回调通常用于侧栏中的文件夹项双击
+ // 实际跳转逻辑应该在NotesListActivity中处理
closeSidebar();
}
@Override
public void onTrashSelected() {
+ Log.d(TAG, "Trash selected");
// TODO: 实现跳转到回收站
// 关闭侧栏
closeSidebar();
@@ -61,27 +108,37 @@ public class MainActivity extends AppCompatActivity implements SidebarFragment.O
@Override
public void onSyncSelected() {
+ Log.d(TAG, "Sync selected");
// TODO: 实现同步功能
}
@Override
public void onLoginSelected() {
+ Log.d(TAG, "Login selected");
// TODO: 实现登录功能
}
@Override
public void onExportSelected() {
+ Log.d(TAG, "Export selected");
// TODO: 实现导出功能
}
@Override
public void onSettingsSelected() {
- // TODO: 实现设置功能
+ Log.d(TAG, "Settings selected");
+ // 打开设置界面
+ Intent intent = new Intent(this, net.micode.notes.ui.NotesPreferenceActivity.class);
+ startActivity(intent);
+ // 关闭侧栏
+ closeSidebar();
}
@Override
public void onCreateFolder() {
- // TODO: 实现创建文件夹功能
+ Log.d(TAG, "Create folder");
+ // 创建文件夹功能由SidebarFragment内部处理
+ // 这里不需要做任何事情
}
@Override
@@ -95,6 +152,8 @@ public class MainActivity extends AppCompatActivity implements SidebarFragment.O
* 关闭侧栏
*/
private void closeSidebar() {
- // TODO: 实现侧栏关闭功能
+ if (drawerLayout != null) {
+ drawerLayout.closeDrawer(Gravity.LEFT);
+ }
}
}
\ No newline at end of file
diff --git a/src/Notesmaster/app/src/main/java/net/micode/notes/ui/NotesListActivity.java b/src/Notesmaster/app/src/main/java/net/micode/notes/ui/NotesListActivity.java
index c237a90..b2e1115 100644
--- a/src/Notesmaster/app/src/main/java/net/micode/notes/ui/NotesListActivity.java
+++ b/src/Notesmaster/app/src/main/java/net/micode/notes/ui/NotesListActivity.java
@@ -807,7 +807,6 @@ public class NotesListActivity extends AppCompatActivity
/**
* 返回键按下事件处理
- *
*
* 多选模式:退出多选模式
* 子文件夹:返回上一级文件夹
diff --git a/src/Notesmaster/app/src/main/java/net/micode/notes/ui/SidebarFragment.java b/src/Notesmaster/app/src/main/java/net/micode/notes/ui/SidebarFragment.java
index 2eec39b..041f68b 100644
--- a/src/Notesmaster/app/src/main/java/net/micode/notes/ui/SidebarFragment.java
+++ b/src/Notesmaster/app/src/main/java/net/micode/notes/ui/SidebarFragment.java
@@ -183,6 +183,7 @@ public class SidebarFragment extends Fragment {
// 设置RecyclerView
rvFolderTree.setLayoutManager(new LinearLayoutManager(requireContext()));
adapter = new FolderTreeAdapter(new ArrayList<>(), viewModel);
+ adapter.setOnFolderItemClickListener(this::handleFolderItemClick);
rvFolderTree.setAdapter(adapter);
}
@@ -243,22 +244,27 @@ public class SidebarFragment extends Fragment {
*/
private void setupFolderClickListener(View view, long folderId) {
view.setOnClickListener(v -> {
+ android.util.Log.d(TAG, "setupFolderClickListener: folderId=" + folderId);
long currentTime = System.currentTimeMillis();
if (lastClickedView == view && (currentTime - lastClickTime) < DOUBLE_CLICK_INTERVAL) {
+ android.util.Log.d(TAG, "Double click on root folder, jumping to: " + folderId);
// 这是双击,执行跳转
- if (listener != null && folderId != Notes.ID_ROOT_FOLDER) {
+ if (listener != null) {
+ // 根文件夹也可以跳转(回到根)
listener.onFolderSelected(folderId);
}
// 重置双击状态
lastClickTime = 0;
lastClickedView = null;
} else {
+ android.util.Log.d(TAG, "Single click on root folder, will toggle expand in " + DOUBLE_CLICK_INTERVAL + "ms");
// 可能是单击,延迟处理
lastClickTime = currentTime;
lastClickedView = view;
view.postDelayed(() -> {
// 如果在延迟期间没有发生双击,则执行单击操作(展开/收起)
if (System.currentTimeMillis() - lastClickTime >= DOUBLE_CLICK_INTERVAL) {
+ android.util.Log.d(TAG, "Toggling root folder expand");
toggleFolderExpand(folderId);
}
}, DOUBLE_CLICK_INTERVAL);
@@ -284,9 +290,44 @@ public class SidebarFragment extends Fragment {
* 切换文件夹展开/收起状态
*/
private void toggleFolderExpand(long folderId) {
+ android.util.Log.d(TAG, "toggleFolderExpand: folderId=" + folderId);
viewModel.toggleFolderExpand(folderId);
}
+ /**
+ * 处理文件夹项点击(单击/双击)
+ */
+ private void handleFolderItemClick(long folderId) {
+ android.util.Log.d(TAG, "handleFolderItemClick: folderId=" + folderId);
+ long currentTime = System.currentTimeMillis();
+ if (lastClickedFolderId == folderId && (currentTime - lastFolderClickTime) < DOUBLE_CLICK_INTERVAL) {
+ android.util.Log.d(TAG, "Double click detected, jumping to folder: " + folderId);
+ // 这是双击,执行跳转
+ if (listener != null) {
+ listener.onFolderSelected(folderId);
+ }
+ // 重置双击状态
+ lastFolderClickTime = 0;
+ lastClickedFolderId = -1;
+ } else {
+ android.util.Log.d(TAG, "Single click, will toggle expand in " + DOUBLE_CLICK_INTERVAL + "ms");
+ // 可能是单击,延迟处理
+ lastFolderClickTime = currentTime;
+ lastClickedFolderId = folderId;
+ new android.os.Handler().postDelayed(() -> {
+ // 如果在延迟期间没有发生双击,则执行单击操作(展开/收起)
+ if (System.currentTimeMillis() - lastFolderClickTime >= DOUBLE_CLICK_INTERVAL) {
+ android.util.Log.d(TAG, "Toggling folder expand: " + folderId);
+ toggleFolderExpand(folderId);
+ }
+ }, DOUBLE_CLICK_INTERVAL);
+ }
+ }
+
+ // 双击检测专用变量(针对文件夹列表项)
+ private long lastFolderClickTime = 0;
+ private long lastClickedFolderId = -1;
+
/**
* 显示创建文件夹对话框
*/
@@ -323,7 +364,7 @@ public class SidebarFragment extends Fragment {
public void onSuccess(Long folderId) {
if (getActivity() != null) {
getActivity().runOnUiThread(() -> {
- Toast.makeText(requireContext(), "创建文件夹成功", Toast.LENGTH_SHORT).show();
+ Toast.makeText(requireContext(), R.string.create_folder_success, Toast.LENGTH_SHORT).show();
// 刷新文件夹列表
viewModel.loadFolderTree();
});
@@ -334,7 +375,9 @@ public class SidebarFragment extends Fragment {
public void onError(Exception error) {
if (getActivity() != null) {
getActivity().runOnUiThread(() -> {
- Toast.makeText(requireContext(), "创建文件夹失败: " + error.getMessage(), Toast.LENGTH_SHORT).show();
+ Toast.makeText(requireContext(),
+ getString(R.string.error_folder_name_too_long) + ": " + error.getMessage(),
+ Toast.LENGTH_SHORT).show();
});
}
}
@@ -345,82 +388,106 @@ public class SidebarFragment extends Fragment {
builder.show();
}
- /**
- * FolderTreeAdapter
- * 文件夹树适配器,支持层级显示和展开/收起
- */
- private static class FolderTreeAdapter extends RecyclerView.Adapter {
+ /**
+ * FolderTreeAdapter
+ * 文件夹树适配器,支持层级显示和展开/收起
+ */
+ private static class FolderTreeAdapter extends RecyclerView.Adapter {
- private List folderItems;
- private FolderListViewModel viewModel;
+ private List folderItems;
+ private FolderListViewModel viewModel;
+ private OnFolderItemClickListener folderItemClickListener;
- public FolderTreeAdapter(List folderItems, FolderListViewModel viewModel) {
- this.folderItems = folderItems;
- this.viewModel = viewModel;
- }
+ public FolderTreeAdapter(List folderItems, FolderListViewModel viewModel) {
+ this.folderItems = folderItems;
+ this.viewModel = viewModel;
+ }
- public void setData(List folderItems) {
- this.folderItems = folderItems;
- }
+ public void setData(List folderItems) {
+ this.folderItems = folderItems;
+ }
- @NonNull
- @Override
- public FolderViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
- View view = LayoutInflater.from(parent.getContext())
- .inflate(R.layout.sidebar_folder_item, parent, false);
- return new FolderViewHolder(view);
- }
+ public void setOnFolderItemClickListener(OnFolderItemClickListener listener) {
+ this.folderItemClickListener = listener;
+ }
- @Override
- public void onBindViewHolder(@NonNull FolderViewHolder holder, int position) {
- FolderTreeItem item = folderItems.get(position);
- boolean isExpanded = viewModel != null && viewModel.isFolderExpanded(item.folderId);
- holder.bind(item, isExpanded);
- }
+ @NonNull
+ @Override
+ public FolderViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ View view = LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.sidebar_folder_item, parent, false);
+ return new FolderViewHolder(view, folderItemClickListener);
+ }
- @Override
- public int getItemCount() {
- return folderItems.size();
- }
+ @Override
+ public void onBindViewHolder(@NonNull FolderViewHolder holder, int position) {
+ FolderTreeItem item = folderItems.get(position);
+ boolean isExpanded = viewModel != null && viewModel.isFolderExpanded(item.folderId);
+ holder.bind(item, isExpanded);
+ }
- static class FolderViewHolder extends RecyclerView.ViewHolder {
- private View indentView;
- private ImageView ivExpandIcon;
- private ImageView ivFolderIcon;
- private TextView tvFolderName;
- private TextView tvNoteCount;
-
- public FolderViewHolder(@NonNull View itemView) {
- super(itemView);
- indentView = itemView.findViewById(R.id.indent_view);
- ivExpandIcon = itemView.findViewById(R.id.iv_expand_icon);
- ivFolderIcon = itemView.findViewById(R.id.iv_folder_icon);
- tvFolderName = itemView.findViewById(R.id.tv_folder_name);
- tvNoteCount = itemView.findViewById(R.id.tv_note_count);
+ @Override
+ public int getItemCount() {
+ return folderItems.size();
}
- public void bind(FolderTreeItem item, boolean isExpanded) {
- // 设置缩进
- int indent = item.level * 32;
- indentView.setLayoutParams(new LinearLayout.LayoutParams(indent, LinearLayout.LayoutParams.MATCH_PARENT));
-
- // 设置展开/收起图标
- if (item.hasChildren) {
- ivExpandIcon.setVisibility(View.VISIBLE);
- ivExpandIcon.setRotation(isExpanded ? 90 : 0);
- } else {
- ivExpandIcon.setVisibility(View.INVISIBLE);
+ static class FolderViewHolder extends RecyclerView.ViewHolder {
+ private View indentView;
+ private ImageView ivExpandIcon;
+ private ImageView ivFolderIcon;
+ private TextView tvFolderName;
+ private TextView tvNoteCount;
+ private FolderTreeItem currentItem;
+ private final OnFolderItemClickListener folderItemClickListener;
+
+ public FolderViewHolder(@NonNull View itemView, OnFolderItemClickListener listener) {
+ super(itemView);
+ this.folderItemClickListener = listener;
+ indentView = itemView.findViewById(R.id.indent_view);
+ ivExpandIcon = itemView.findViewById(R.id.iv_expand_icon);
+ ivFolderIcon = itemView.findViewById(R.id.iv_folder_icon);
+ tvFolderName = itemView.findViewById(R.id.tv_folder_name);
+ tvNoteCount = itemView.findViewById(R.id.tv_note_count);
}
- // 设置文件夹名称
- tvFolderName.setText(item.name);
+ public void bind(FolderTreeItem item, boolean isExpanded) {
+ this.currentItem = item;
+
+ // 设置缩进
+ int indent = item.level * 32;
+ indentView.setLayoutParams(new LinearLayout.LayoutParams(indent, LinearLayout.LayoutParams.MATCH_PARENT));
+
+ // 设置展开/收起图标
+ if (item.hasChildren) {
+ ivExpandIcon.setVisibility(View.VISIBLE);
+ ivExpandIcon.setRotation(isExpanded ? 90 : 0);
+ } else {
+ ivExpandIcon.setVisibility(View.INVISIBLE);
+ }
+
+ // 设置文件夹名称
+ tvFolderName.setText(item.name);
+
+ // 设置便签数量
+ tvNoteCount.setText(String.format(itemView.getContext()
+ .getString(R.string.folder_note_count), item.noteCount));
- // 设置便签数量
- tvNoteCount.setText(String.format(itemView.getContext()
- .getString(R.string.folder_note_count), item.noteCount));
+ // 设置点击监听器
+ itemView.setOnClickListener(v -> {
+ if (folderItemClickListener != null) {
+ folderItemClickListener.onFolderClick(item.folderId);
+ }
+ });
+ }
}
}
- }
+
+ /**
+ * 文件夹项点击监听器接口
+ */
+ public interface OnFolderItemClickListener {
+ void onFolderClick(long folderId);
+ }
/**
* FolderTreeItem
diff --git a/src/Notesmaster/app/src/main/java/net/micode/notes/viewmodel/FolderListViewModel.java b/src/Notesmaster/app/src/main/java/net/micode/notes/viewmodel/FolderListViewModel.java
index 683a128..fc98f66 100644
--- a/src/Notesmaster/app/src/main/java/net/micode/notes/viewmodel/FolderListViewModel.java
+++ b/src/Notesmaster/app/src/main/java/net/micode/notes/viewmodel/FolderListViewModel.java
@@ -80,11 +80,19 @@ public class FolderListViewModel extends AndroidViewModel {
* @param folderId 文件夹ID
*/
public void toggleFolderExpand(long folderId) {
+ android.util.Log.d(TAG, "toggleFolderExpand: folderId=" + folderId);
+ android.util.Log.d(TAG, "Before toggle, expandedFolders: " + expandedFolderIds);
+
if (expandedFolderIds.contains(folderId)) {
expandedFolderIds.remove(folderId);
+ android.util.Log.d(TAG, "Collapsed folder: " + folderId);
} else {
expandedFolderIds.add(folderId);
+ android.util.Log.d(TAG, "Expanded folder: " + folderId);
}
+
+ android.util.Log.d(TAG, "After toggle, expandedFolders: " + expandedFolderIds);
+
// 重新加载文件夹树
loadFolderTree();
}
@@ -126,6 +134,8 @@ public class FolderListViewModel extends AndroidViewModel {
// 查询所有文件夹(不包括系统文件夹)
List