(科特琳)从内部存储设备加载文件,并使用它在画布上绘制

时间:2019-02-10 18:46:43

标签: canvas kotlin getfiles

我在使用保存在应用程序内部存储中的文本文件,并无法确定将在画布上绘制哪些位图以及它们的放置位置时遇到问题。我的应用程序已成功创建文件。似乎“ filesDir”存在问题,但仅在某些情况下如此。

问题是,当我插入时

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

在“ Canvas类”或“重写onDraw”中,“ filesDir”突然变成“未解决的引用”。

所以-为了绕过这个-我创建了“布局”类。看起来像这样:

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
    }
}

我已经在ViewLayout类的“ override fun onCreate”(也包含Canvas类)中对其进行了测试,并且它就像一种魅力。

当在类Canvas内部使用时,

val layout = Layout()

它的构建没有错误,但是,当我在手机上运行应用程序时,会发生以下错误:“试图在null上调用虚拟方法'java.io.File android.content.Context.getFilesDir()'对象引用”

作为错误的根源,它直接指向

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

在我的Layout类中,当在Canvas类中创建其实例时。

我只是不知道该怎么办。我已经在Google上进行了一些搜索,实际上,人们在尝试使用应用程序内部存储中的文件来基于其绘图几乎没有任何事情。

1 个答案:

答案 0 :(得分:0)

很抱歉这么晚了,但是我正式回答了这个问题。感谢Pawel的帮助!

首先,我的 Layout 类不应是活动类。我已经删除了扩展名,并使用 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
    }
}