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

У меня проблемы с использованием текстового файла, сохраненного во внутреннем хранилище моего приложения, и с его помощью, чтобы определить, какие растровые изображения будут нарисованы на холсте и каковы будут их размещение.Файл успешно создается моим приложением.Кажется, что есть проблема с «filesDir», но только при определенных обстоятельствах.

Проблема в том, что я вставляю

val file: List<String> = File(this.filesDir, "TempLayoutData.txt").readLines()

внутри «класса Canvass» или «переопределить веселье на 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, и буквально ничего не говорится о людях, пытающихся использовать файл из внутреннего хранилища приложения, чтобы основывать на нем свои рисунки.

1 Ответ

0 голосов
/ 03 марта 2019

Извините, что позаботился об этом так поздно, но я официально отвечаю на этот вопрос.Все благодаря помощи Павла!

Прежде всего, мой класс 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
    }
}
...