Commit 4e260ff2 authored by wanglei's avatar wanglei

Files页面

parent 8f114531
......@@ -20,6 +20,9 @@
android:supportsRtl="true"
android:theme="@style/Theme.SimpleFilesManager"
tools:targetApi="31">
<activity
android:name=".simplelist.SimpleListActivity"
android:exported="false" />
<activity
android:name=".simplegrid.SimpleGridActivity"
android:exported="false" />
......@@ -49,6 +52,17 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="android:authorities">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
</application>
</manifest>
\ No newline at end of file
package com.zxhy.simplefilesmanager.simpleCommon
import android.content.Context
import android.os.Environment
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.zxhy.simplefilesmanager.simpledata.JoFileJo
import com.zxhy.simplefilesmanager.simpledata.JoGridFileJo
import com.zxhy.simplefilesmanager.simpledata.JoGridFileJo.Companion.joGridFileJo
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.io.File
import java.util.LinkedList
import kotlin.reflect.KFunction0
abstract class SimpleCommonViewModel : ViewModel() {
private fun linkedWhileFolder(folder: File, onDo: ((file: File) -> Unit)?) {
//添加第一层文件到链表
val linkList = LinkedList<File>()
val fileList = folder.listFiles()
fileList?.forEach {
if (it.isDirectory) {
linkList.add(it)
} else {
onDo?.invoke(it)
}
}
//链表取文件
var tempFile: File
while (!linkList.isEmpty()) {
tempFile = linkList.removeFirst()
val tempFileList = tempFile.listFiles()
tempFileList?.forEach {
if (it.isDirectory) {
linkList.add(it)
} else {
onDo?.invoke(it)
}
}
}
}
fun deleteFiles(files: List<File>, action: () -> Unit) =
viewModelScope.launch(Dispatchers.IO) {
runCatching {
files.forEach {
if (it.exists()) it.delete()
}
action.invoke()
}
}
/**
* @param filter 过滤条件
* @param convert 抓换为JoFileJo的转换方法
* @param onDo 扫描部分数据执行
* @param onFinish 扫描完成执行
*/
fun <T : JoFileJo> loadFile(
filter: (file: File) -> Boolean,
convert: (file: File) -> T,
onDo: (list: List<T>) -> Unit,
onFinish: (list: List<T>) -> Unit
) = viewModelScope.launch(Dispatchers.IO) {
val root = Environment.getExternalStorageDirectory()
val resultList = arrayListOf<T>()
var firstSend = false
linkedWhileFolder(root) { file ->
if (filter(file)) {
resultList.add(convert(file))
if (resultList.size == 20 && !firstSend) {
val mainList = arrayListOf<T>()
mainList.addAll(resultList)
//这里onDo切换到main主协程,避免IO协程里的数据和main协程里的数据共用同一对象
onDo.invoke(mainList)
resultList.clear()
firstSend = true
}
}
}
onFinish.invoke(resultList)
}
}
\ No newline at end of file
......@@ -42,12 +42,12 @@ abstract class JoCommonJoAdapter<T : ViewHolder, E : JoFileJo>() : RecyclerView.
}
fun getSelectData(): List<E> {
return joFileList.filter { it.isSelect }
return joFileList.filter { it.isSelected }
}
fun toggleSelect(select: Boolean) {
joFileList.forEach { fileBean ->
fileBean.isSelect = select
fileBean.isSelected = select
}
notifyDataSetChanged()
}
......
package com.zxhy.simplefilesmanager.simpledata
import android.net.Uri
import java.io.File
abstract class JoFileJo(
val name: String = "",
var fName: String = "",
val jisd: String = "",
var isSelect: Boolean = false,
var isSelected: Boolean = false,
val sdadsd: Int = 0,
val sdsadgb: Float = 0.2f,
var path: String = ""
) {
fun toFile(): File {
return File(path)
}
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as JoFileJo
if (name != other.name) return false
if (fName != other.fName) return false
if (jisd != other.jisd) return false
if (isSelect != other.isSelect) return false
if (isSelected != other.isSelected) return false
if (sdadsd != other.sdadsd) return false
if (sdsadgb != other.sdsadgb) return false
......@@ -26,11 +31,13 @@ abstract class JoFileJo(
}
override fun hashCode(): Int {
var result = name.hashCode()
var result = fName.hashCode()
result = 31 * result + jisd.hashCode()
result = 31 * result + isSelect.hashCode()
result = 31 * result + isSelected.hashCode()
result = 31 * result + sdadsd
result = 31 * result + sdsadgb.hashCode()
return result
}
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simpledata
import android.net.Uri
import java.io.File
class JoGridFileJo(
val sdad: String = "",
var uri: Uri = Uri.EMPTY,
) : JoFileJo() {
companion object {
fun joGridFileJo(file: File): JoGridFileJo {
return JoGridFileJo().apply {
path = file.absolutePath
fName = file.name
}
}
fun File.joGridFileJo2(): JoGridFileJo {
return JoGridFileJo().apply {
fName = name
}
}
}
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simpledata
class JoListFileJo(
val timeE: String = "",
val sss: Int = 0,
) : JoFileJo() {
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simplefile
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController
import com.zxhy.simplefilesmanager.R
import com.zxhy.simplefilesmanager.databinding.FragmentSimpleFileBinding
import com.zxhy.simplefilesmanager.simpledata.JoFileJo
import com.zxhy.simplefilesmanager.simpledata.JoJoRecentImage
import com.zxhy.simplefilesmanager.simplejoke.IntentEx.systemActionView
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
......@@ -37,7 +37,9 @@ class SimpleFileFragment() : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
// Log.e(TAG, "onViewCreated")
super.onViewCreated(view, savedInstanceState)
adapter = SimpleRecentAdapter(requireContext())
adapter = SimpleRecentAdapter(requireContext()) {
systemActionView(requireContext(), it)
}
binding.rv.adapter = adapter
viewMode.joloadjoRecentImage(requireContext()) { list ->
lifecycleScope.launch(Dispatchers.Main) {
......@@ -45,6 +47,18 @@ class SimpleFileFragment() : Fragment() {
adapter.setData(datas)
}
}
binding.ivImage.setOnClickListener {
val args = Bundle().apply {
putString("Tittle", "IMAGE")
}
findNavController().navigate(R.id.simpleGridActivity, args)
}
binding.ivVideo.setOnClickListener {
val args = Bundle().apply {
putString("Tittle", "VIDEO")
}
findNavController().navigate(R.id.simpleGridActivity, args)
}
}
......
package com.zxhy.simplefilesmanager.simplefile
import android.content.Context
import android.net.Uri
import android.view.RoundedCorner
import android.view.View
import android.view.ViewGroup
......@@ -18,8 +19,10 @@ import com.zxhy.simplefilesmanager.simpledata.JoJoRecentImage
import com.zxhy.simplefilesmanager.simplejoke.DipPxEx.dp2px
import com.zxhy.simplefilesmanager.simplejoke.JoXmljoEx.jojoinflate
class SimpleRecentAdapter(val context: Context) :
JoCommonJoAdapter<SimpleRecentAdapter.AA, JoJoRecentImage>() {
class SimpleRecentAdapter(
val context: Context,
private val itemClick: (uri: Uri) -> Unit
) : JoCommonJoAdapter<SimpleRecentAdapter.AA, JoJoRecentImage>() {
private val options =
RequestOptions()
.transform(CenterCrop(), RoundedCorners(dp2px(context, R.dimen.dp_8)))
......@@ -39,5 +42,8 @@ class SimpleRecentAdapter(val context: Context) :
.load(data.uri)
.apply(options)
.into(holder.binding.iv)
holder.binding.root.setOnClickListener {
itemClick.invoke(data.uri)
}
}
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simplegrid
import android.content.Intent
import android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP
import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.FileProvider
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import com.zxhy.simplefilesmanager.R
import com.zxhy.simplefilesmanager.databinding.ActivitySimpleGridBinding
import com.zxhy.simplefilesmanager.simpledata.JoGridFileJo
import com.zxhy.simplefilesmanager.simplejoke.IntentEx.systemActionView
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.io.File
class SimpleGridActivity : AppCompatActivity() {
private lateinit var binding: ActivitySimpleGridBinding
private val viewModel: SimpleGridViewModel by viewModels()
private lateinit var adapter: SimpleGridAdapter
private var tittle: String = ""
private val TAG = "SimpleGridActivity"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
......@@ -20,5 +38,58 @@ class SimpleGridActivity : AppCompatActivity() {
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
tittle = intent.extras?.getString("Tittle") ?: ""
binding.tvTittle.text = tittle
binding.flBack.setOnClickListener { finish() }
adapter = SimpleGridAdapter(tittle == "VIDEO", this,
selectClick = { count ->
if (count == 0) {
binding.tvItems.visibility = View.INVISIBLE
} else {
binding.tvItems.visibility = View.VISIBLE
binding.tvItems.text = this.getString(R.string.select_d_items, count)
}
},
itemClick = { path ->
systemActionView(this, path, tittle)
})
binding.rv.adapter = adapter
if (tittle == "IMAGE") {
viewModel.loadImage(::onFistRefresh, ::onCompleteRefresh)
}
if (tittle == "VIDEO") {
viewModel.loadVideo(::onFistRefresh, ::onCompleteRefresh)
}
binding.flDelete.setOnClickListener {
val datas = adapter.getSelectData()
val files = datas.map { it.toFile() }
viewModel.deleteFiles(files) {
lifecycleScope.launch(Dispatchers.Main) {
adapter.removeData(datas)
}
}
}
}
private fun onFistRefresh(list: List<JoGridFileJo>) = lifecycleScope.launch(Dispatchers.Main) {
if (list.isNotEmpty()) {
binding.pb.visibility = View.GONE
binding.rv.visibility = View.VISIBLE
binding.flDelete.visibility = View.VISIBLE
adapter.setData(list)
}
}
private fun onCompleteRefresh(list: List<JoGridFileJo>) =
lifecycleScope.launch(Dispatchers.Main) {
if (list.isNotEmpty()) {
binding.pb.visibility = View.GONE
binding.rv.visibility = View.VISIBLE
binding.flDelete.visibility = View.VISIBLE
adapter.addData(list)
}
}
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simplegrid
import android.content.Context
import android.net.Uri
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestOptions
import com.zxhy.simplefilesmanager.R
import com.zxhy.simplefilesmanager.databinding.ItemJoIVJoSelectBinding
import com.zxhy.simplefilesmanager.simpleadpter.JoCommonJoAdapter
import com.zxhy.simplefilesmanager.simpledata.JoFileJo
import com.zxhy.simplefilesmanager.simplejoke.DipPxEx
import com.zxhy.simplefilesmanager.simplejoke.JoXmljoEx.jojoinflate
class SimpleGridAdapter(
private val isVideo: Boolean = false,
private val context: Context,
private val selectClick: (count: Int) -> Unit,
private val itemClick: (path: String) -> Unit,
) : JoCommonJoAdapter<SimpleGridAdapter.HH, JoFileJo>() {
private val options =
RequestOptions()
.transform(CenterCrop(), RoundedCorners(DipPxEx.dp2px(context, R.dimen.dp_8)))
class HH(view: View) : ViewHolder(view) {
val binding = ItemJoIVJoSelectBinding.bind(view)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HH {
return HH(R.layout.item_jo_i_v_jo_select.jojoinflate(parent))
}
override fun onBindViewHolder(holder: HH, position: Int) {
}
override fun onBindViewHolder(holder: HH, position: Int, payloads: MutableList<Any>) {
val context = holder.binding.root.context
val data = joFileList[position]
if (payloads.isEmpty()) {
if (isVideo) holder.binding.ivCamera.visibility = View.VISIBLE
Glide.with(context)
.load(data.path)
.apply(options)
.into(holder.binding.iv)
holder.binding.ivSelector.isSelected = data.isSelected
holder.binding.ivSelector.setOnClickListener {
data.isSelected = !data.isSelected
holder.binding.ivSelector.isSelected = data.isSelected
notifyItemChanged(position, "sumdk")
selectClick.invoke(getSelectData().size)
}
holder.binding.root.setOnClickListener {
itemClick.invoke(data.path)
}
} else {
holder.binding.ivSelector.isSelected = data.isSelected
super.onBindViewHolder(holder, position, payloads)
}
}
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simplegrid
import androidx.lifecycle.viewModelScope
import com.zxhy.simplefilesmanager.simpleCommon.SimpleCommonViewModel
import com.zxhy.simplefilesmanager.simpledata.JoGridFileJo
import com.zxhy.simplefilesmanager.simpledata.JoGridFileJo.Companion.joGridFileJo
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.io.File
class SimpleGridViewModel : SimpleCommonViewModel() {
private fun isImage(file: File): Boolean {
return file.name.contains(".jpg") or file.name.contains(".png") or file.name.contains(".gif")
}
private fun isVideo(file: File): Boolean {
return file.name.contains(".mp4") or
file.name.contains(".avi") or
file.name.contains(".flv") or
file.name.contains(".rmvb") or
file.name.contains(".mkv")
}
fun loadImage(
onDo: (list: List<JoGridFileJo>) -> Unit,
onFinish: (list: List<JoGridFileJo>) -> Unit
) = loadFile(::isImage, ::joGridFileJo, onDo, onFinish)
fun loadVideo(
onDo: (list: List<JoGridFileJo>) -> Unit,
onFinish: (list: List<JoGridFileJo>) -> Unit
) = loadFile(::isVideo, ::joGridFileJo, onDo, onFinish)
}
\ No newline at end of file
......@@ -6,12 +6,14 @@ import android.net.Uri
import android.os.Build
import android.provider.Settings
import androidx.annotation.RequiresApi
import androidx.core.content.FileProvider
import java.io.File
/**
* 访问所有文件权限设置界面
* https://blog.csdn.net/qq_17766199/article/details/115351949
*/
object IntentEx{
object IntentEx {
@RequiresApi(Build.VERSION_CODES.R)
fun settingManageExternalStorage(uri: Uri? = null): Intent {
val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, uri)
......@@ -32,4 +34,27 @@ object IntentEx{
return Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
.setData(Uri.fromParts("package", packageName, null))
}
fun systemActionView(context: Context, path: String, tittle: String = "IMAGE") {
val uri =
FileProvider.getUriForFile(context, "${context.packageName}.provider", File(path))
val intent = Intent().apply {
action = Intent.ACTION_VIEW
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
val type = if (tittle == "IMAGE") "image/*" else "video/*"
setDataAndType(uri, type)
}
context.startActivity(intent)
}
fun systemActionView(context: Context, uri: Uri, tittle: String = "IMAGE") {
val intent = Intent().apply {
action = Intent.ACTION_VIEW
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
setDataAndType(uri, if (tittle == "IMAGE") "image/*" else "video/*")
}
context.startActivity(intent)
}
}
package com.zxhy.simplefilesmanager.simplelist
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.zxhy.simplefilesmanager.R
import com.zxhy.simplefilesmanager.databinding.ActivitySimpleListBinding
class SimpleListActivity : AppCompatActivity() {
private lateinit var binding: ActivitySimpleListBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding = ActivitySimpleListBinding.inflate(layoutInflater)
setContentView(binding.root)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
}
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simplelist
import android.content.Context
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestOptions
import com.zxhy.simplefilesmanager.R
import com.zxhy.simplefilesmanager.databinding.ItemJoListFileJoBinding
import com.zxhy.simplefilesmanager.simpleadpter.JoCommonJoAdapter
import com.zxhy.simplefilesmanager.simpledata.JoListFileJo
import com.zxhy.simplefilesmanager.simplejoke.DipPxEx
import com.zxhy.simplefilesmanager.simplejoke.JoXmljoEx.jojoinflate
class SimpleListAdapter(val context: Context) :
JoCommonJoAdapter<SimpleListAdapter.CC, JoListFileJo>() {
private val options =
RequestOptions()
.transform(CenterCrop(), RoundedCorners(DipPxEx.dp2px(context, R.dimen.dp_8)))
class CC(view: View) : ViewHolder(view) {
val binding = ItemJoListFileJoBinding.bind(view)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CC {
return CC(R.layout.item_jo_list_file_jo.jojoinflate(parent))
}
override fun onBindViewHolder(holder: CC, position: Int) {
}
override fun onBindViewHolder(holder: CC, position: Int, payloads: MutableList<Any>) {
val data = joFileList[position]
if (payloads.isEmpty()) {
Glide.with(context)
.load(data.path)
.apply(options)
.into(holder.binding.iv)
} else {
super.onBindViewHolder(holder, position, payloads)
}
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/afa_6956" android:state_selected="true" />
<item android:drawable="@mipmap/das_58985" android:state_selected="false" />
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/low_87955" android:state_selected="false" />
<item android:drawable="@mipmap/wkeoi_78956" android:state_selected="true" />
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".simplegrid.SimpleGridActivity">
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<FrameLayout
android:layout_width="match_parent"
android:layout_height="36dp"
app:layout_constraintTop_toTopOf="parent">
<FrameLayout
android:id="@+id/fl_back"
android:layout_width="65dp"
android:layout_height="match_parent">
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="12dp"
android:src="@mipmap/dsf_5978897" />
</FrameLayout>
<TextView
android:id="@+id/tv_tittle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="#FF333333"
android:textSize="16sp"
android:textStyle="bold" />
<FrameLayout
android:id="@+id/fl_delete"
android:layout_width="65dp"
android:layout_height="match_parent"
android:layout_gravity="end"
android:visibility="gone">
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical|end"
android:layout_marginEnd="12dp"
android:src="@mipmap/kkwoe_89795" />
</FrameLayout>
</FrameLayout>
<TextView
android:id="@+id/tv_items"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/select_d_items"
android:visibility="invisible" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="8dp"
android:overScrollMode="never"
android:visibility="invisible"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="3"
tools:listitem="@layout/item_jo_i_v_jo_select" />
<ProgressBar
android:id="@+id/pb"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:indeterminate="true"
android:indeterminateTint="#5BBAFF"
android:indeterminateTintMode="src_atop" />
</FrameLayout>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".simplelist.SimpleListActivity">
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -50,10 +50,12 @@
android:id="@+id/iv_image"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginStart="20dp"
android:layout_marginTop="16dp"
android:src="@mipmap/sgga_999997"
app:layout_constraintEnd_toStartOf="@+id/iv_video"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintHorizontal_chainStyle="spread_inside"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
......@@ -117,6 +119,7 @@
android:id="@+id/iv_large_file"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginEnd="20dp"
android:src="@mipmap/fasd_589256"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
......@@ -139,12 +142,15 @@
android:id="@+id/iv_zip"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginStart="20dp"
android:layout_marginBottom="34dp"
android:src="@mipmap/sfz_6985"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/iv_apk"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent" />
app:layout_constraintHorizontal_chainStyle="spread_inside"
app:layout_constraintStart_toStartOf="parent"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
......@@ -206,6 +212,7 @@
android:id="@+id/iv_empty_file"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginEnd="20dp"
android:src="@mipmap/koas_87985"
app:layout_constraintBottom_toBottomOf="@id/iv_zip"
app:layout_constraintEnd_toEndOf="parent"
......
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_margin="6dp">
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ImageView
android:id="@+id/iv_camera"
android:layout_width="28dp"
android:layout_height="24dp"
android:layout_gravity="center"
android:src="@mipmap/wkoe_41879"
android:visibility="invisible" />
<ImageView
android:id="@+id/iv_selector"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_gravity="end|bottom"
android:layout_margin="5dp"
android:src="@drawable/bg_grid_selector" />
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="horizontal">
<ImageView
android:id="@+id/iv"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center_vertical"
tools:ignore="ContentDescription" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:text="Image"
android:textColor="#FF333333"
android:textSize="14sp"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="January 5, 2024 2 itmes"
android:textColor="#FF999999"
android:textSize="12sp"
tools:ignore="HardcodedText" />
</LinearLayout>
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:layout_margin="12dp"
android:src="@drawable/bg_list_selector" />
</LinearLayout>
\ No newline at end of file
......@@ -25,4 +25,10 @@
app:uri="https://www.zxhy.com/simplefile/" />
</fragment>
<activity
android:id="@+id/simpleGridActivity"
android:name="com.zxhy.simplefilesmanager.simplegrid.SimpleGridActivity"
android:label="activity_simple_grid"
tools:layout="@layout/activity_simple_grid">
</activity>
</navigation>
\ No newline at end of file
......@@ -2,4 +2,5 @@
<string name="app_name">Simple Files Manager</string>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
<string name="select_d_items">Select %d items</string>
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<paths>
<!--内置SD卡 Environment.getExternalStorageDirectory() .表示共享所有的目录,也可以指定共享的目录-->
<external-path
name="external-path"
path="."/>
<!--内置SD卡 Context.getExternalCacheDir() .表示共享所有的目录,也可以指定共享的目录-->
<external-cache-path
name="external-cache-path"
path="."/>
<!--内置SD卡 Context.getExternalFilesDir(null) .表示共享所有的目录,也可以指定共享的目录-->
<external-files-path
name="external-files-path"
path="."/>
<!--data目录下 Context.getFilesDir() .表示共享所有的目录,也可以指定共享的目录-->
<files-path
name="files_path"
path="."/>
<!--data缓存目录 Context.getCacheDir() .表示共享所有的目录,也可以指定共享的目录-->
<cache-path
name="cache-path"
path="."/>
<!--这个标签Android官方文档中是没有提及,Android设备的根目录,该目录下包含着手机内部存储器,外置SD卡等所有文件的目录-->
<root-path
name="name"
path="."/>
<external-path
name="external_storage_root"
path="." />
</paths>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment