(Котлин) Загрузка файла из внутреннего хранилища и использование его для рисования на холсте

У меня проблемы с использованием текстового файла, сохраненного во внутреннем хранилище моего приложения, и с его помощью, чтобы определить, какие растровые изображения будут нарисованы на холсте и каковы будут их размещение. Файл успешно создается моим приложением. Кажется, что есть проблема с "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
    }
}
Другие вопросы по тегам