完善侧边栏文件夹目录功能

pull/12/head
包尔俊 1 month ago
parent 607af6d090
commit 8cf957b1c3

@ -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;
/**
*
* <p>
*
*
*
* </p>
*/
public class MainActivity extends AppCompatActivity implements SidebarFragment.OnSidebarItemSelectedListener {
private static final String TAG = "MainActivity";
private DrawerLayout drawerLayout;
/**
*
* <p>
@ -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);
}
}
}

@ -807,7 +807,6 @@ public class NotesListActivity extends AppCompatActivity
/**
*
*
* <p>
* 退
*

@ -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.FolderViewHolder> {
/**
* FolderTreeAdapter
* /
*/
private static class FolderTreeAdapter extends RecyclerView.Adapter<FolderTreeAdapter.FolderViewHolder> {
private List<FolderTreeItem> folderItems;
private FolderListViewModel viewModel;
private List<FolderTreeItem> folderItems;
private FolderListViewModel viewModel;
private OnFolderItemClickListener folderItemClickListener;
public FolderTreeAdapter(List<FolderTreeItem> folderItems, FolderListViewModel viewModel) {
this.folderItems = folderItems;
this.viewModel = viewModel;
}
public FolderTreeAdapter(List<FolderTreeItem> folderItems, FolderListViewModel viewModel) {
this.folderItems = folderItems;
this.viewModel = viewModel;
}
public void setData(List<FolderTreeItem> folderItems) {
this.folderItems = folderItems;
}
public void setData(List<FolderTreeItem> 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

@ -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<Map<String, Object>> folders = queryAllFolders();
android.util.Log.d("FolderListViewModel", "QueryAllFolders returned " + folders.size() + " folders");
// 构建文件夹映射表(方便查找父文件夹)
Map<Long, FolderNode> folderMap = new HashMap<>();
List<FolderNode> rootFolders = new ArrayList<>();
@ -137,15 +147,20 @@ public class FolderListViewModel extends AndroidViewModel {
long parentId = (Long) folder.get(NoteColumns.PARENT_ID);
int noteCount = ((Number) folder.get(NoteColumns.NOTES_COUNT)).intValue();
android.util.Log.d("FolderListViewModel", "Folder: id=" + id + ", name=" + name + ", parentId=" + parentId);
FolderNode node = new FolderNode(id, name, parentId, noteCount);
folderMap.put(id, node);
// 如果是顶级文件夹(父文件夹为根),添加到根列表
if (parentId == Notes.ID_ROOT_FOLDER) {
rootFolders.add(node);
android.util.Log.d("FolderListViewModel", "Added root folder: " + name);
}
}
android.util.Log.d("FolderListViewModel", "Root folders count: " + rootFolders.size());
// 构建父子关系
for (FolderNode node : folderMap.values()) {
if (node.parentId != Notes.ID_ROOT_FOLDER) {
@ -160,15 +175,18 @@ public class FolderListViewModel extends AndroidViewModel {
List<FolderTreeItem> folderTree = new ArrayList<>();
// 检查根文件夹是否展开
boolean rootExpanded = expandedFolderIds.contains(Notes.ID_ROOT_FOLDER);
android.util.Log.d("FolderListViewModel", "Root expanded: " + rootExpanded);
buildFolderTreeList(rootFolders, folderTree, 0, rootExpanded);
android.util.Log.d("FolderListViewModel", "Final folder tree size: " + folderTree.size());
return folderTree;
}
/**
*
*
* (level=0)"我的便签"
*
* @param nodes
* @param folderTree
* @param level
@ -176,11 +194,8 @@ public class FolderListViewModel extends AndroidViewModel {
*/
private void buildFolderTreeList(List<FolderNode> nodes, List<FolderTreeItem> folderTree, int level, boolean forceExpandChildren) {
for (FolderNode node : nodes) {
// 对于顶层文件夹,需要"我的便签"展开后才显示
if (level == 0 && !expandedFolderIds.contains(Notes.ID_ROOT_FOLDER) && !forceExpandChildren) {
continue; // 跳过顶层文件夹,因为根未展开
}
// 顶级文件夹始终显示level=0
// 移除了之前的条件判断,让所有顶级文件夹都能显示
folderTree.add(new FolderTreeItem(
node.id,
node.name,
@ -190,6 +205,7 @@ public class FolderListViewModel extends AndroidViewModel {
));
// 只有当父文件夹在 expandedFolderIds 中时,才递归处理子文件夹
// 有子节点(!node.children.isEmpty())才检查展开状态
if (!node.children.isEmpty() && expandedFolderIds.contains(node.id)) {
buildFolderTreeList(node.children, folderTree, level + 1, false);
}
@ -221,13 +237,31 @@ public class FolderListViewModel extends AndroidViewModel {
NoteColumns.MODIFIED_DATE + " DESC"
);
android.util.Log.d("FolderListViewModel", "Query executed, cursor: " + (cursor != null ? cursor.getCount() : "null"));
if (cursor != null) {
android.util.Log.d("FolderListViewModel", "Column names: " + java.util.Arrays.toString(cursor.getColumnNames()));
while (cursor.moveToNext()) {
Map<String, Object> folder = new HashMap<>();
long id = cursor.getLong(cursor.getColumnIndexOrThrow(NoteColumns.ID));
String name = cursor.getString(cursor.getColumnIndexOrThrow(NoteColumns.SNIPPET));
long parentId = cursor.getLong(cursor.getColumnIndexOrThrow(NoteColumns.PARENT_ID));
int noteCount = cursor.getInt(cursor.getColumnIndexOrThrow(NoteColumns.NOTES_COUNT));
// 尝试获取parent_id可能列名不对
int parentIdIndex = cursor.getColumnIndex(NoteColumns.PARENT_ID);
long parentId = -1;
if (parentIdIndex != -1) {
parentId = cursor.getLong(parentIdIndex);
}
// 尝试获取notes_count
int notesCountIndex = cursor.getColumnIndex(NoteColumns.NOTES_COUNT);
int noteCount = 0;
if (notesCountIndex != -1) {
noteCount = cursor.getInt(notesCountIndex);
}
android.util.Log.d("FolderListViewModel", "Folder data: id=" + id + ", name=" + name + ", parentId=" + parentId + ", noteCount=" + noteCount);
folder.put(NoteColumns.ID, id);
folder.put(NoteColumns.SNIPPET, name);
@ -238,6 +272,7 @@ public class FolderListViewModel extends AndroidViewModel {
}
}
} catch (Exception e) {
android.util.Log.e("FolderListViewModel", "Error querying folders", e);
e.printStackTrace();
} finally {
if (cursor != null) {

@ -120,7 +120,17 @@
<string name="datetime_dialog_ok">设置</string>
<string name="datetime_dialog_cancel">取消</string>
<plurals name="search_results_title">
<item quantity="other"><xliff:g id="NUMBER">%1$s</xliff:g> 条符合<xliff:g id="SEARCH">%2$s</xliff:g>的搜索结果</item>
<item quantity="other"><xliff:g id="NUMBER">%1$s</xliff:g> 条符合"<xliff:g id="SEARCH">%2$s</xliff:g>"的搜索结果</item>
</plurals>
<!-- Sidebar -->
<string name="root_folder_name">我的便签</string>
<string name="folder_note_count">%d 个便签</string>
<string name="dialog_create_folder_title">创建文件夹</string>
<string name="dialog_create_folder_hint">文件夹名称</string>
<string name="error_folder_name_empty">文件夹名称不能为空</string>
<string name="error_folder_name_too_long">文件夹名称过长最多50个字符</string>
<string name="menu_trash">回收站</string>
<string name="create_folder_success">创建文件夹成功</string>
</resources>

@ -138,18 +138,18 @@
<string name="empty_notes_icon">空便签图标</string>
<string name="menu_edit_note">Edit note</string>
<!-- Sidebar strings -->
<string name="root_folder_name">我的便签</string>
<string name="sidebar_close">关闭侧栏</string>
<string name="sidebar_create_folder">创建文件夹</string>
<string name="menu_login">登录</string>
<string name="menu_export">导出</string>
<string name="menu_settings">设置</string>
<string name="menu_trash">回收站</string>
<string name="folder_note_count">%1$d个便签</string>
<string name="dialog_create_folder_title">创建文件夹</string>
<string name="dialog_create_folder_hint">请输入文件夹名称</string>
<string name="error_folder_name_empty">文件夹名称不能为空</string>
<string name="error_folder_name_too_long">文件夹名称不能超过50个字符</string>
<string name="error_folder_name_exists">该文件夹已存在</string>
<string name="create_folder_success">创建文件夹成功</string>
<string name="menu_login">Login</string>
<string name="menu_export">Export</string>
<string name="menu_settings">Settings</string>
<string name="menu_trash">Trash</string>
<string name="root_folder_name">My Notes</string>
<string name="sidebar_close">Close sidebar</string>
<string name="sidebar_create_folder">Create folder</string>
<string name="folder_note_count">%d notes</string>
<string name="dialog_create_folder_title">Create folder</string>
<string name="dialog_create_folder_hint">Folder name</string>
<string name="error_folder_name_empty">Folder name cannot be empty</string>
<string name="error_folder_name_too_long">Folder name too long (max 50 characters)</string>
<string name="error_folder_name_exists">Folder already exists</string>
<string name="create_folder_success">Folder created successfully</string>
</resources>

@ -2,21 +2,30 @@
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.text=ALL-UNNAMED --add-opens=java.desktop/java.awt.font=ALL-UNNAMED
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. For more details, visit
# This option should only be used with decoupled projects.
# For more details, visit
# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Enables namespacing of each library's R class so that its R class includes only the
# resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library
android.nonTransitiveRClass=true
android.nonFinalResIds=false
# 测试配置
android.testOptions.unitTests.isReturnDefaultValues=true

Loading…
Cancel
Save