RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1104404
Accepted
danilshik
danilshik
Asked:2020-04-02 19:59:38 +0000 UTC2020-04-02 19:59:38 +0000 UTC 2020-04-02 19:59:38 +0000 UTC

单例 Android Kotlin

  • 772

需要帮助创建单例。

有一个类 - 文件资源管理器。

在片段中,我创建了一个类的实例,如果文件是文件夹,那么在文件资源管理器中,我移动到文件夹级别,片段被简单地重新打开,当前文件夹中的数据应该已经加载

class FileManager(context: Context) {

    private lateinit var currentDirectory: File
    private var rootDirecory: File
    private var instance : FileManager? = null

    init {
        Log.d("Класс создался", "тут")
        val directory: File
        if (Environment.MEDIA_MOUNTED == Environment.getExternalStorageState())
            directory = Environment.getExternalStorageDirectory()
        else
            directory = ContextCompat.getDataDir(context)!!
        rootDirecory = directory
        navigateTo(directory)
    }

    fun navigateTo(directory: File): Boolean {
        /**
         * Проверяем является ли файл директорией
         */
        if (!directory.isDirectory) {
            Log.d("FileManager", "${directory.absolutePath} is not a directory!")
            return false
        }

        /**
         * Проверим, не поднялись ли мы выше rootDirectory
         */

        if ((directory != rootDirecory) && rootDirecory.absolutePath.contains(directory.absolutePath)) {
            Log.w(
                "FileManager",
                "Trying to navigate upper than root directory to " + directory.absolutePath
            );
            return false
        }

        currentDirectory = directory
        return true
    }

    fun navigateUp(): Boolean {
        return navigateTo(currentDirectory.parentFile!!)
    }

    fun getFiles(): ArrayList<File> {
        val items = ArrayList<File>()
        val files = currentDirectory.listFiles()
        files?.let {
            items.addAll(currentDirectory.listFiles())
        }
        return items
    }

    fun getInstance(context: Context): FileManager{
        if(instance == null)
            instance = FileManager(context)
        return instance as FileManager
    }
}

我不知道如何将代码从 init 移动到主构造函数,并且由于 Init 始终有效,结果证明这不是单例

而且我还是不喜欢我的调用方式,你需要去掉不必要的参数

fileManager = FileManager(context!!).getInstance(context!!)

分段

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        fileManager = FileManager(context!!).getInstance(context!!)
        val bundle = this.arguments

        fileProviderAdapter = FileProviderAdapter{

            if(it.isDirectory){
                fileManager.navigateTo(it.absoluteFile)
                Log.d("нафигация", it.absoluteFile.toString())
                Snackbar.make(getView()!!, "Навигация ${it.name}", Snackbar.LENGTH_LONG)
                    .show()
                loadFragment(FileProviderFragment())
            }
            else{
                Snackbar.make(getView()!!, "Клик по ${it.name}", Snackbar.LENGTH_LONG)
                    .show()
            }
android
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Alex_Skvortsov
    2020-04-02T20:15:22Z2020-04-02T20:15:22Z

    您需要像这样重写代码:

    class FileManager {
    
        private constructor(context: Context) {
            Log.d("Класс создался", "тут")
            val directory: File = if (Environment.MEDIA_MOUNTED == Environment.getExternalStorageState())
                Environment.getExternalStorageDirectory()
            else ContextCompat.getDataDir(context) ?: throw Exception("File does not exist!")
            rootDirectory = directory
            navigateTo(directory)
        }
    
        private lateinit var currentDirectory: File
        private var rootDirectory: File
    
        fun navigateTo(directory: File): Boolean {
            /**
             * Проверяем является ли файл директорией
             */
            if (!directory.isDirectory) {
                Log.d("FileManager", "${directory.absolutePath} is not a directory!")
                return false
            }
    
            /**
             * Проверим, не поднялись ли мы выше rootDirectory
             */
    
            if ((directory != rootDirectory) && rootDirectory.absolutePath.contains(directory.absolutePath)) {
                Log.w(
                        "FileManager",
                        "Trying to navigate upper than root directory to " + directory.absolutePath
                );
                return false
            }
    
            currentDirectory = directory
            return true
        }
    
        fun navigateUp(): Boolean {
            return navigateTo(currentDirectory.parentFile!!)
        }
    
        fun getFiles(): ArrayList<File> {
            val items = ArrayList<File>()
            val files = currentDirectory.listFiles()
            files?.let {
                items.addAll(currentDirectory.listFiles())
            }
            return items
        }
    
        companion object {
            private lateinit var instance: FileManager
            fun getInstance(context: Context): FileManager {
                if (!::instance.isInitialized)
                    instance = FileManager(context)
                return instance
            }
        }
    }
    

    呼叫现在将如下所示:

    FileMAnager.getInstance(context)
    
    • 2

相关问题

  • 来自片段的列表落后于 BottomNavigationView

  • 无法将变量从 Activity 传递到 Fragment

  • 构建与完成的片段略有不同的片段的最佳方法是什么?

  • 如何更改来自服务器的响应中的日期格式?

  • 谷歌地图在应用程序的发布版本中不起作用

  • 材料设计按钮。单击按钮上的可选区域!

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5