From 899b9ff8996d1b99682ecad084861dbc316c305a Mon Sep 17 00:00:00 2001 From: ThankVinci Date: Fri, 11 Jun 2021 16:43:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B9=8B=E5=89=8D=E7=9A=84log=E6=89=93?= =?UTF-8?q?=E5=BE=97=E8=B7=9F=E6=97=A5=E8=AE=B0=E4=B8=80=E6=A0=B7=201.?= =?UTF-8?q?=E6=84=9F=E8=A7=89=E5=85=88=E6=98=BE=E7=A4=BA=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=86=8D=E6=98=BE=E7=A4=BA=E6=96=87=E4=BB=B6=E5=A4=B9=E8=BF=98?= =?UTF-8?q?=E6=98=AF=E5=A4=AA=E4=B8=91=E4=BA=86,=E6=94=B9=E4=BA=86?= =?UTF-8?q?=E5=9B=9E=E6=9D=A5=202.=E8=8E=B7=E5=8F=96=E5=A4=96=E9=83=A8?= =?UTF-8?q?=E5=AD=98=E5=82=A8=E6=A0=B9=E7=9B=AE=E5=BD=95=E7=9A=84=E7=94=B1?= =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E7=BB=99=E8=B7=AF=E5=BE=84=E6=94=B9=E6=88=90?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E8=B0=83=E7=94=A8=E8=8E=B7=E5=8F=96=203.?= =?UTF-8?q?=E6=96=B0=E5=BB=BA=E4=BA=86=E4=B8=80=E4=B8=AANetCheck=E7=B1=BB,?= =?UTF-8?q?=E7=94=A8=E4=BA=8E=E6=A3=80=E6=B5=8B=E5=BD=93=E5=89=8D=E7=BD=91?= =?UTF-8?q?=E7=BB=9C=E7=8A=B6=E6=80=81,=E4=BD=86=E6=98=AF=E5=85=B7?= =?UTF-8?q?=E4=BD=93=E5=8A=9F=E8=83=BD=E5=B9=B6=E6=B2=A1=E6=9C=89=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=204.=E5=AE=9E=E7=8E=B0=E4=BA=86fragment=E4=B9=8B?= =?UTF-8?q?=E9=97=B4=E7=9A=84=E8=B7=B3=E8=BD=AC=E5=92=8C=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=9A=84=E4=BC=A0=E9=80=92,=E5=8D=B3=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=B9=E6=89=93=E5=BC=80=E8=AF=A5=E7=9B=AE?= =?UTF-8?q?=E5=BD=95,=E7=84=B6=E5=90=8E=E5=8F=91=E7=8E=B0=E7=A9=BA?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E4=BC=9A=E5=8F=91=E7=94=9F=E7=A9=BA=E6=8C=87?= =?UTF-8?q?=E9=92=88=E5=BC=82=E5=B8=B8=E4=B9=9F=E4=B8=80=E5=B9=B6=E5=A4=84?= =?UTF-8?q?=E7=90=86=E4=BA=86=20fragment=E7=9A=84=E8=B7=B3=E8=BD=AC?= =?UTF-8?q?=E5=92=8C=E5=8F=82=E8=80=83=E5=AE=98=E6=96=B9=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E5=92=8Chttps://blog.csdn.net/m0=5F46962786/article/details/10?= =?UTF-8?q?9119746,=E8=BF=99=E7=AF=87=E6=96=87=E7=AB=A0,=E5=AF=B9nav=5Fgra?= =?UTF-8?q?ph=E4=B8=AD=E7=9A=84filemanagefragment(=E7=AE=80=E7=A7=B0fm)?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86action=E5=92=8Cargument?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 完成了文件管理的功能,然后正在删除一些冗余的代码 --- .../CloudKey/Files/FileAdapter.java | 41 ++++++++++- .../thankvinci/CloudKey/Files/FileItem.java | 3 + .../thankvinci/CloudKey/Files/FileUtils.java | 8 +-- .../CloudKey/Fragment/FileManageFragment.java | 68 +++++++++++++++---- .../CloudKey/NetUtils/NetCheck.java | 4 ++ .../main/res/layout/filemanage_fragment.xml | 5 +- .../app/src/main/res/navigation/nav_graph.xml | 16 ++++- 开发历程.md | 37 +++++++++- 8 files changed, 157 insertions(+), 25 deletions(-) create mode 100644 CloudKey/app/src/main/java/com/thankvinci/CloudKey/NetUtils/NetCheck.java diff --git a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileAdapter.java b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileAdapter.java index dae299f..8c4aa66 100644 --- a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileAdapter.java +++ b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileAdapter.java @@ -1,5 +1,6 @@ package com.thankvinci.CloudKey.Files; +import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; @@ -10,15 +11,23 @@ import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentTransaction; +import androidx.navigation.Navigation; import androidx.recyclerview.widget.RecyclerView; +import com.thankvinci.CloudKey.Fragment.FileManageFragment; import com.thankvinci.CloudKey.R; +import java.io.File; import java.util.List; public class FileAdapter extends RecyclerView.Adapter { private List fileList; + private Fragment fragment; + + private static FileAdapter adapter; static class ViewHolder extends RecyclerView.ViewHolder{ ImageView icon; @@ -31,19 +40,44 @@ public class FileAdapter extends RecyclerView.Adapter { name = file.findViewById(R.id.file_name); } } - public FileAdapter(List fileList){ + public static FileAdapter getInstance(List fileList,Fragment fragment){ + if(adapter != null){ + return adapter; + } + adapter = new FileAdapter(fileList,fragment); + return adapter; + } + public void setFileList(List fileList){ + this.fileList = fileList; + } + public FileAdapter(List fileList,Fragment fragment){ this.fileList = fileList; + this.fragment = fragment; } @Override public FileAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.file_item,parent,false); ViewHolder holder = new ViewHolder(view); + Bundle data = new Bundle(); + holder.file.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ int position = holder.getAdapterPosition(); FileItem fitem = fileList.get(position); - Toast.makeText(view.getContext(),fitem.getName(),Toast.LENGTH_SHORT).show(); + Toast.makeText(v.getContext(),fitem.getName(),Toast.LENGTH_SHORT).show(); + if(fitem.isDir()){ + StringBuilder builder = new StringBuilder(); + builder.append(((FileManageFragment)fragment).getDir()); + builder.append("/"); + builder.append(fitem.getName()); + data.putString("dir",builder.toString()); + data.putBoolean("isRoot",false); + Navigation.findNavController(v).navigate(R.id.action_openDir,data); + }else{ + Toast.makeText(v.getContext(),"没有打开除文件夹和压缩包以外的功能",Toast.LENGTH_SHORT).show(); + } + } }); return holder; @@ -58,6 +92,9 @@ public class FileAdapter extends RecyclerView.Adapter { @Override public int getItemCount() { + if (fileList == null){ + return 0; + } return fileList.size(); } } diff --git a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileItem.java b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileItem.java index 26178e4..bfb655e 100644 --- a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileItem.java +++ b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileItem.java @@ -29,4 +29,7 @@ public class FileItem { public int getIcon(){ return icon; } + public boolean isDir(){ + return !type; + } } diff --git a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileUtils.java b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileUtils.java index 14c1473..babd67f 100644 --- a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileUtils.java +++ b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileUtils.java @@ -7,19 +7,19 @@ import java.util.Comparator; import java.util.List; public class FileUtils { - //按照文件,文件夹,文件名次序的顺序进行排序,参考:https://blog.csdn.net/qq_34246164/article/details/111785553 + //按照文件夹,文件,文件名次序的顺序进行排序,参考:https://blog.csdn.net/qq_34246164/article/details/111785553 public static void orderByName(File[] files){ List fileList = Arrays.asList(files); Collections.sort(fileList, new Comparator() { @Override public int compare(File f1,File f2){ if(f1.isDirectory() && f2.isFile()){ - return 0; + return -1; } if(f2.isDirectory() && f1.isFile()){ - return -1; + return 0; } - return f1.getName().compareTo(f2.getName()); + return (f1.getName().toUpperCase()).compareTo((f2.getName().toUpperCase())); } }); } diff --git a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Fragment/FileManageFragment.java b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Fragment/FileManageFragment.java index c565c7a..e1738b6 100644 --- a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Fragment/FileManageFragment.java +++ b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Fragment/FileManageFragment.java @@ -1,10 +1,15 @@ package com.thankvinci.CloudKey.Fragment; import android.os.Bundle; +import android.os.Environment; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import android.widget.EditText; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.core.app.ActivityCompat; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.RecyclerView; @@ -18,27 +23,48 @@ import com.thankvinci.CloudKey.R; import java.io.File; import java.util.ArrayList; import java.util.List; +import java.util.Stack; public class FileManageFragment extends Fragment { + private String dir; //当前fragment加载的目录 + private boolean isRoot; //是否是根目录布局 + private EditText path_edit; private RecyclerView directoryView; - private List fileItemList = new ArrayList<>(); + private List fileItemList; private String fileNames[]; private File files[]; public FileManageFragment(){ super(R.layout.filemanage_fragment); } + @Override public void onViewCreated(View view,Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); path_edit = getView().findViewById(R.id.path_name); directoryView = (RecyclerView)getView().findViewById(R.id.dir_list); - loadRoot(); + + Bundle data = getArguments(); + dir = data.getString("dir"); + isRoot = data.getBoolean("isRoot"); + Toast.makeText(getActivity(),dir+isRoot,Toast.LENGTH_SHORT).show(); + if(isRoot){ + loadRoot(); + }else{ + loadDirectory(dir); + } + initLayout(); + } + public String getDir(){ + return dir; + } + private void initLayout(){ StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL); directoryView.setLayoutManager(layoutManager); - FileAdapter adapter = new FileAdapter(fileItemList); + FileAdapter adapter = FileAdapter.getInstance(fileItemList,this); + adapter.setFileList(fileItemList); directoryView.setAdapter(adapter); } private void loadRoot() { @@ -46,25 +72,39 @@ public class FileManageFragment extends Fragment { ActivityCompat.requestPermissions(getActivity(), new String[]{ //运行时权限 "android.permission.WRITE_EXTERNAL_STORAGE", "android.permission.READ_EXTERNAL_STORAGE"}, 1); - //File root = getActivity().getExternalFilesDir(null); - //File root = new File(Environment.getExternalStorageState()); - File root = new File("/storage/emulated/0"); - Toast.makeText(getActivity(),root.getAbsolutePath()+"",Toast.LENGTH_SHORT).show(); - Toast.makeText(getActivity(),root.canRead()+"",Toast.LENGTH_SHORT).show(); + + String rootPath = Environment.getExternalStorageDirectory().getPath(); + dir = rootPath; + path_edit.setText(dir); + File root = new File(rootPath); files = root.listFiles(); - FileUtils.orderByName(files); - path_edit.setText("/storage/emulated/0"); - initDirectory(); + if (files == null){ + //当目录里为空时,列表为空对象 + }else{ + FileUtils.orderByName(files); + + initDirectory(); + } + } public void loadDirectory(String path){ ActivityCompat.requestPermissions(getActivity(), new String[]{ //运行时权限 "android.permission.WRITE_EXTERNAL_STORAGE", "android.permission.READ_EXTERNAL_STORAGE"}, 1); + path_edit.setText(path); File directory = new File(path); - Toast.makeText(getActivity(),directory.getAbsolutePath()+"",Toast.LENGTH_SHORT).show(); - initDirectory(); + files = directory.listFiles(); + if (files == null){ + //当目录里为空时,列表为空对象 + }else{ + FileUtils.orderByName(files); + initDirectory(); + } + Toast.makeText(getActivity(),directory.canRead()+"",Toast.LENGTH_SHORT).show(); } private void initDirectory(){ + fileItemList = null; + fileItemList = new ArrayList<>(); String filename,suffix; boolean isFile,isZip; int lastIndex,index; @@ -90,8 +130,6 @@ public class FileManageFragment extends Fragment { if(index != 0){ //隐藏.开头的隐藏文件 FileItem fitem = new FileItem(filename,isFile,isZip); fileItemList.add(fitem); - }else{ - } } } diff --git a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/NetUtils/NetCheck.java b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/NetUtils/NetCheck.java new file mode 100644 index 0000000..4a405ae --- /dev/null +++ b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/NetUtils/NetCheck.java @@ -0,0 +1,4 @@ +package com.thankvinci.CloudKey.NetUtils; + +public class NetCheck { +} diff --git a/CloudKey/app/src/main/res/layout/filemanage_fragment.xml b/CloudKey/app/src/main/res/layout/filemanage_fragment.xml index 0513399..cb505a7 100644 --- a/CloudKey/app/src/main/res/layout/filemanage_fragment.xml +++ b/CloudKey/app/src/main/res/layout/filemanage_fragment.xml @@ -10,10 +10,11 @@ android:id="@+id/path_name" android:layout_width="match_parent" android:layout_height="wrap_content" - android:editable="false" - android:focusedByDefault="true" + android:focusable="false" android:text="/emulated/0/sdcard" android:textColor="@color/grey" + android:textSize="14dp" + android:singleLine="true" tools:ignore="MissingConstraints" /> + tools:layout="@layout/filemanage_fragment" > + + + +