(Котлин) Загрузка файла из внутреннего хранилища и использование его для рисования на холсте
У меня проблемы с использованием текстового файла, сохраненного во внутреннем хранилище моего приложения, и с его помощью, чтобы определить, какие растровые изображения будут нарисованы на холсте и каковы будут их размещение. Файл успешно создается моим приложением. Кажется, что есть проблема с "filesDir", но только при определенных обстоятельствах.
Проблема в том, когда я вставляю
val file: List<String> = File(this.filesDir, "TempLayoutData.txt").readLines()
внутри "class Canvass" или "override fun onDraw" "filesDir" внезапно становится "неразрешенной ссылкой".
Итак, чтобы обойти это, я создал класс "Layout". Это выглядит так:
class Layout : AppCompatActivity(){
val file: List<String> = File(this.filesDir, "TempLayoutData.txt").readLines()
val stagewidth = file[0].toInt() * 10
val stagelength = file[1].toInt() * 10
var layout = Array(stagelength) { IntArray(stagewidth) }
var rowcounter = 0
var columncounter = 0
var read = File(this.filesDir, "TempLayout.txt").forEachLine {
for (i in it) {
layout[rowcounter][columncounter] = (i - 48).toInt()
columncounter++
}
rowcounter++
columncounter = 0
}
}
Я проверил его внутри "override fun onCreate" моего класса ViewLayout (который также содержит класс Canvas), и он работал как шарм.
Когда это прямо внутри класса Canvas, воплощенный в жизнь, используя
val layout = Layout()
он собирается без ошибок, однако при запуске приложения на телефоне возникает следующая ошибка: "Попытка вызвать виртуальный метод java.io.File android.content.Context.getFilesDir() для ссылки на нулевой объект"
Как источник ошибки, он указывает непосредственно на
val file: List<String> = File(this.filesDir, "TempLayoutData.txt").readLines()
внутри моего класса Layout, когда его экземпляр создается внутри класса Canvas.
И я просто не знаю, что делать. Я провел некоторый поиск в Google, и в нем практически ничего не говорится о людях, пытающихся использовать файл из внутреннего хранилища приложения, чтобы основывать на нем свои рисунки.
0 ответов
Извините за то, что позаботился об этом так поздно, но я официально отвечаю на этот вопрос. Все благодаря помощи Павла!
Прежде всего, мой класс Layout никогда не должен быть классом активности. Я удалил расширение и добавил конструктор с Context. Я также изменил "this." На "context." Перед "filesDir". Теперь это выглядит так:
class Layout (context: Context){
private val file: List<String> = File(context.filesDir, "TempLayoutData.txt").readLines()
val stageWidth = file[0].toInt() * 10
val stageLength = file[1].toInt() * 10
var layout = Array(stageLength) { IntArray(stageWidth) }
private var rowCounter = 0
private var columnCounter = 0
var read = File(context.filesDir, "TempLayoutLayout.txt").forEachLine {
for (i in it) {
layout[rowCounter][columnCounter] = (i - 48).toInt()
columnCounter++
}
rowCounter++
columnCounter = 0
}
}