diff --git a/CloudKey/app/src/main/AndroidManifest.xml b/CloudKey/app/src/main/AndroidManifest.xml index 991551b..4ddee3b 100644 --- a/CloudKey/app/src/main/AndroidManifest.xml +++ b/CloudKey/app/src/main/AndroidManifest.xml @@ -2,6 +2,8 @@ + + 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 new file mode 100644 index 0000000..dae299f --- /dev/null +++ b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileAdapter.java @@ -0,0 +1,63 @@ +package com.thankvinci.CloudKey.Files; + +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.recyclerview.widget.RecyclerView; + +import com.thankvinci.CloudKey.R; + +import java.util.List; + +public class FileAdapter extends RecyclerView.Adapter { + + private List fileList; + + static class ViewHolder extends RecyclerView.ViewHolder{ + ImageView icon; + TextView name; + View file; + public ViewHolder(View fileView){ + super(fileView); + file = fileView; + icon = file.findViewById(R.id.file_icon); + name = file.findViewById(R.id.file_name); + } + } + public FileAdapter(List fileList){ + this.fileList = fileList; + } + @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); + 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(); + } + }); + return holder; + } + + @Override + public void onBindViewHolder(FileAdapter.ViewHolder holder, int position) { + FileItem fileItem = fileList.get(position); + holder.icon.setImageResource(fileItem.getIcon()); + holder.name.setText(fileItem.getName()); + } + + @Override + public int getItemCount() { + 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 new file mode 100644 index 0000000..26178e4 --- /dev/null +++ b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileItem.java @@ -0,0 +1,32 @@ +package com.thankvinci.CloudKey.Files; + +import android.widget.ImageView; + +import com.thankvinci.CloudKey.R; + +public class FileItem { + private int icon; + private String name; + private boolean type; //File为true,Directory为false + private boolean isZip; //在type为true下才有效,是压缩文件就为true,为普通文件就为false; 这里的压缩文件格式为zip,可能会增加rar和7z + + public FileItem(String name, boolean type, boolean isZip){ + this.type = type; + this.name = name; + if(type){ + if(isZip){ + icon = R.drawable.zip; + }else{ + icon = R.drawable.file; + } + }else{ + icon = R.drawable.directory; + } + } + public String getName(){ + return name; + } + public int getIcon(){ + return icon; + } +} 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 9f194b6..ce7717c 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 @@ -2,17 +2,90 @@ package com.thankvinci.CloudKey.Fragment; import android.os.Bundle; import android.view.View; +import android.widget.EditText; +import android.widget.Toast; +import androidx.core.app.ActivityCompat; import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.StaggeredGridLayoutManager; +import com.thankvinci.CloudKey.Files.FileAdapter; +import com.thankvinci.CloudKey.Files.FileItem; import com.thankvinci.CloudKey.R; +import java.io.File; +import java.util.ArrayList; +import java.util.List; + public class FileManageFragment extends Fragment { + + private EditText path_edit; + private RecyclerView directoryView; + private List fileItemList = new ArrayList<>(); + 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(); + StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL); + directoryView.setLayoutManager(layoutManager); + FileAdapter adapter = new FileAdapter(fileItemList); + directoryView.setAdapter(adapter); + } + private void loadRoot() { + //加载外部存储的根目录 + 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(); + files = root.listFiles(); + path_edit.setText("/storage/emulated/0"); + initDirectory(); + } + public void loadDirectory(String path){ + ActivityCompat.requestPermissions(getActivity(), new String[]{ //运行时权限 + "android.permission.WRITE_EXTERNAL_STORAGE", + "android.permission.READ_EXTERNAL_STORAGE"}, 1); + File directory = new File(path); + Toast.makeText(getActivity(),directory.getAbsolutePath()+"",Toast.LENGTH_SHORT).show(); + initDirectory(); + } + private void initDirectory(){ + String filename,suffix; + boolean isFile,isZip; + int lastIndex; + for(int i = 0;i < files.length;i++){ + filename = files[i].getName(); + isFile = files[i].isFile(); + if (isFile){ + lastIndex = filename.lastIndexOf("."); + if(lastIndex == -1){ + suffix = "."; //当文件没有后缀时,不过没什么实际含义就对了 + }else { + suffix = filename.substring(lastIndex); + } + if(".zip".equals(suffix)){ + isZip = true; + }else{ + isZip = false; + } + }else{ + isZip = false; + } + FileItem fitem = new FileItem(filename,isFile,isZip); + fileItemList.add(fitem); + } } } diff --git a/CloudKey/app/src/main/res/drawable-v24/icon_be_clicked.xml b/CloudKey/app/src/main/res/drawable-v24/icon_be_clicked.xml new file mode 100644 index 0000000..c9d6b9e --- /dev/null +++ b/CloudKey/app/src/main/res/drawable-v24/icon_be_clicked.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/CloudKey/app/src/main/res/layout/file_item.xml b/CloudKey/app/src/main/res/layout/file_item.xml new file mode 100644 index 0000000..69cd32b --- /dev/null +++ b/CloudKey/app/src/main/res/layout/file_item.xml @@ -0,0 +1,36 @@ + + + + + + + + \ No newline at end of file diff --git a/CloudKey/app/src/main/res/layout/filemanage_fragment.xml b/CloudKey/app/src/main/res/layout/filemanage_fragment.xml index 2e7c27a..0513399 100644 --- a/CloudKey/app/src/main/res/layout/filemanage_fragment.xml +++ b/CloudKey/app/src/main/res/layout/filemanage_fragment.xml @@ -3,6 +3,24 @@ android:layout_width="match_parent" android:layout_height="match_parent" xmlns:tools="http://schemas.android.com/tools" - tools:context=".Fragment.FileManageFragment" > + xmlns:app="http://schemas.android.com/apk/res-auto" + tools:context=".Fragment.FileManageFragment"> + + + + \ No newline at end of file diff --git a/CloudKey/app/src/main/res/values/colors.xml b/CloudKey/app/src/main/res/values/colors.xml index f8c6127..2f9b575 100644 --- a/CloudKey/app/src/main/res/values/colors.xml +++ b/CloudKey/app/src/main/res/values/colors.xml @@ -6,5 +6,12 @@ #FF03DAC5 #FF018786 #FF000000 + #FF343434 #FFFFFFFF + #FFff0000 + #FF0000ff + #FFffff00 + #FF00ff00 + #00ffffff + #5fffffff \ No newline at end of file diff --git a/开发历程.md b/开发历程.md index 2fa145f..2b5c28a 100644 --- a/开发历程.md +++ b/开发历程.md @@ -165,4 +165,20 @@ implementation 'androidx.navigation:navigation-ui:2.2.2' **2021/6/10** -修改了后端的代码,后端只会返回两种数据,一种是普通字符串,android端获取后会toast出来,另一种是json字符串,如果是json字符串就解析,然后对数据库进行相应的操作. \ No newline at end of file +修改了后端的代码,后端只会返回两种数据,一种是普通字符串,android端获取后会toast出来,另一种是json字符串,如果是json字符串就解析,然后对数据库进行相应的操作. + +然后就完成了bug反馈的功能 + +写完后端和完成bug反馈功能后就发现,自定义的Handler的功能似乎写死了,不能针对不同的界面进行对应的操作,也不是说不行,只是看上去会有点乱,所以,handler处理msg也要制定一个规范 + +**2021/06/10** + +决定还是先把核心功能完成了,完成过程中再想想handler怎么搞才合适 + +在file_manage_fragment使用RecyclerView来作为文件管理器的布局,文件部分要申请本地读写权限,尤其是运行时权限,还要在manifest文件中的标签中android:requestLegacyExternalStorage="true" + +**发现当物理机WiFi网络连不上互联网或者没开数据时会闪退,所以要通过广播机制判断当前的网络状态**,之后再改 + + + +代码参考《第二行代码》中对recyclerview的瀑布流应用,需要创建布局除了放置recyclerview的fragment外还需要一个表示recyclerview子项的file文件布局(图标+文字),图标是请一个熟人帮忙设计的.然后图标pressed状态下有一个遮罩,也是要写一个selector来修改样式,所以同样在colors文件中添加我要使用的颜色 \ No newline at end of file