需要帮助创建单例。
有一个类 - 文件资源管理器。
在片段中,我创建了一个类的实例,如果文件是文件夹,那么在文件资源管理器中,我移动到文件夹级别,片段被简单地重新打开,当前文件夹中的数据应该已经加载
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()
}
您需要像这样重写代码:
呼叫现在将如下所示: