Android + KOTLIN:查找文件夹并将其名称存储为字符串数组

时间:2018-10-21 14:32:42

标签: android kotlin directory

我有一个PHP脚本,该脚本能够自动查找文件夹并将其名称作为字符串发送给客户端,以便可以在innerHTML按钮中使用它们。我想在Android应用程序中使用Android Studio和Kotlin进行完全相同的操作,但是我没有找到任何特定的方法来完成该操作。

以下是获取所有文件夹名称并将其存储为数组的PHP代码:

$_SESSION['$folders'] =[] #initiates array
$_SESSION['$folders'] = array_filter(glob('*'), 'is_dir'); #finds subfolders in the root folder and stores their names

但是,文件夹和PHP脚本都在同一目录中,因此,除了array_filter及其消除参数glob('*')is_dir之外,不需要进一步的路径字符串处理在上面的代码中,这就是我在Kotlin中寻找的“魔术”。

由于似乎我在这里没有足够的声誉而无法发送图片。

1 个答案:

答案 0 :(得分:0)

在Android中,您应严格指定要查看的文件夹的路径。 起点可以是 provisioner "local-exec" { command = <<EOT export KUBECONFIG=/root/.kube/config kubectl create -f resource1.yml kubectl create -f resource2.yml unset KUBECONFIG EOT } -主共享/外部存储目录。

然后,您可以使用方法Environment.getExternalStorageDirectory()获取文件列表。如果您需要以某种方式对其进行过滤(例如仅具有目录),则可以添加 FileFilter dir.listFiles()

另一个重要的事情是您必须具有读取外部storange的权限。因此,您应该添加到您的 Manifest.xml

dir.listFiles(FileFilter { it.isDirectory })

从Android 6.0开始,您还应该请求此权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

并在 Fragment.onRequestPermissionsResult 方法中处理结果。


我创建了如何一起使用的示例。 您需要创建活动并在其中添加一个片段: DirListFragment

Fragment.requestPermissions(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), READ_STORAGE_RC)

DirListAdapter

class DirListFragment : Fragment() {

    private val adapter by lazy { DirListAdapter { dir = it } }
    private var dir: File by observable(Environment.getExternalStorageDirectory()) { _, _, _ -> onNewParent() }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View =
        inflater.inflate(R.layout.fragment_dir_list, container, false)

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        checkPermissionReadStorage(requireActivity())
        list.adapter = adapter
        up.setOnClickListener { dir = dir.parentFile }
        onNewParent()
    }

    private fun onNewParent() {
        parent.text = dir.absolutePath
        adapter.items = dir.listFiles(FileFilter { it.isDirectory })?.toList() ?: emptyList()
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == READ_STORAGE_RC && permissionGranted(requireActivity())) onNewParent()
    }

    private fun checkPermissionReadStorage(activity: Activity) {
        if (!permissionGranted(activity)) {
            requestPermissions(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), READ_STORAGE_RC)
        }
    }

    private fun permissionGranted(activity: Activity) =
        ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED

    private companion object {
        const val READ_STORAGE_RC = 123
    }
}

fragment_dir_list.xml

class DirListAdapter(private val clickListener: (file: File) -> Unit) :
    RecyclerView.Adapter<DirListAdapter.ViewHolder>() {

    var items by Delegates.observable(listOf<File>()) { _, _, _ -> notifyDataSetChanged() }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder(parent)

    override fun getItemCount() = items.size

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.caption.text = items[position].name
        holder.caption.setOnClickListener { clickListener(items[position]) }
    }

    class ViewHolder(parent: ViewGroup) : RecyclerView.ViewHolder
        (LayoutInflater.from(parent.context).inflate(android.R.layout.simple_list_item_1, parent, false)) {

        val caption: TextView = itemView.findViewById(android.R.id.text1)
    }
}

希望这将有助于您了解基础。