决定还是先把核心功能完成了,完成过程中再想想handler怎么搞才合适

在file_manage_fragment使用RecyclerView来作为文件管理器的布局,文件部分要申请本地读写权限,尤其是运行时权限,还要在manifest文件中的<application>标签中android:requestLegacyExternalStorage="true"

**发现当物理机WiFi网络连不上互联网或者没开数据时会闪退,所以要通过广播机制判断当前的网络状态**,之后再改

添加了文件布局

代码参考《第二行代码》中对recyclerview的瀑布流应用,需要创建布局除了放置recyclerview的fragment外还需要一个表示recyclerview子项的file文件布局(图标+文字),图标是请一个熟人帮忙设计的.然后图标pressed状态下有一个遮罩,也是要写一个selector来修改样式,所以同样在colors文件中添加我要使用的颜色
master
ThankVinci 4 years ago
parent ac26f754af
commit aa488274e7

@ -2,6 +2,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.thankvinci.CloudKey">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/icon"
@ -9,6 +11,7 @@
android:roundIcon="@mipmap/icon_round"
android:supportsRtl="true"
android:usesCleartextTraffic="true"
android:requestLegacyExternalStorage="true"
android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
<activity android:name=".MainActivity">
<intent-filter>

@ -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<FileAdapter.ViewHolder> {
private List<FileItem> 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<FileItem> 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();
}
}

@ -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;
}
}

@ -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<FileItem> 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);
}
}
}

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="false" android:drawable="@color/transparent"/>
<item android:state_pressed="true" android:drawable="@color/translucent"/>
</selector>

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:orientation="vertical"
xmlns:app="http://schemas.android.com/apk/res-auto">
<ImageView
android:id="@+id/file_icon"
android:layout_width="60dp"
android:layout_height="60dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:scaleType="centerInside"
tools:ignore="MissingConstraints" />
<TextView
android:id="@+id/file_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="2"
android:lines="2"
app:layout_constraintTop_toBottomOf="@id/file_icon"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
tools:ignore="MissingConstraints" />
<ImageView
android:id="@+id/file_icon_up"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@drawable/icon_be_clicked"
app:layout_constraintTop_toTopOf="@id/file_icon"
tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -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">
<EditText
android:id="@+id/path_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:editable="false"
android:focusedByDefault="true"
android:text="/emulated/0/sdcard"
android:textColor="@color/grey"
tools:ignore="MissingConstraints" />
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/dir_list"
app:layout_constraintTop_toTopOf="@id/path_name"
android:layout_marginTop="40dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>

@ -6,5 +6,12 @@
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="grey">#FF343434</color>
<color name="white">#FFFFFFFF</color>
<color name="red">#FFff0000</color>
<color name="blue">#FF0000ff</color>
<color name="yellow">#FFffff00</color>
<color name="green">#FF00ff00</color>
<color name="transparent">#00ffffff</color>
<color name="translucent">#5fffffff</color>
</resources>

@ -165,4 +165,20 @@ implementation 'androidx.navigation:navigation-ui:2.2.2'
**2021/6/10**
修改了后端的代码,后端只会返回两种数据,一种是普通字符串,android端获取后会toast出来,另一种是json字符串,如果是json字符串就解析,然后对数据库进行相应的操作.
修改了后端的代码,后端只会返回两种数据,一种是普通字符串,android端获取后会toast出来,另一种是json字符串,如果是json字符串就解析,然后对数据库进行相应的操作.
然后就完成了bug反馈的功能
写完后端和完成bug反馈功能后就发现,自定义的Handler的功能似乎写死了,不能针对不同的界面进行对应的操作,也不是说不行,只是看上去会有点乱,所以,handler处理msg也要制定一个规范
**2021/06/10**
决定还是先把核心功能完成了,完成过程中再想想handler怎么搞才合适
在file_manage_fragment使用RecyclerView来作为文件管理器的布局,文件部分要申请本地读写权限,尤其是运行时权限,还要在manifest文件中的<application>标签中android:requestLegacyExternalStorage="true"
**发现当物理机WiFi网络连不上互联网或者没开数据时会闪退,所以要通过广播机制判断当前的网络状态**,之后再改
代码参考《第二行代码》中对recyclerview的瀑布流应用,需要创建布局除了放置recyclerview的fragment外还需要一个表示recyclerview子项的file文件布局(图标+文字),图标是请一个熟人帮忙设计的.然后图标pressed状态下有一个遮罩,也是要写一个selector来修改样式,所以同样在colors文件中添加我要使用的颜色
Loading…
Cancel
Save