Android中使用resources.openRawResource读取raw文件失败求助
解决resources.openRawResource找不到raw文件的问题
你的问题核心出在导入了错误的R类,另外还有几个细节需要调整,具体如下:
1. 错误的R类导入导致资源找不到
你代码里第一行导入的是import android.R,这是Android系统自带的资源类,而你自己的grewords.txt属于项目自定义资源,应该引用你项目专属的R类(即com.example.vocabquiz.R)。
解决方法:
- 删除
import android.R这一行 - 确保代码中导入的是自己项目的R类,若IDE未自动导入,可手动添加
import com.example.vocabquiz.R
2. 检查raw文件和文件夹规范
- 确认
raw文件夹创建在app/src/main/res目录下,位置不能错 - 文件名必须全小写,不能包含空格、大写字母或特殊字符(你的
grewords.txt符合要求,这点没问题可忽略)
3. 局部函数的调用问题
你把readDictionaryFile()定义在了onCreate()方法内部,属于局部函数,不仅外部无法调用,而且当前代码也没有执行这个方法去读取文件。需要把它移到onCreate()外面作为成员函数,或者在onCreate()内部调用它。
修正后的代码示例
package com.example.vocabquiz // 删除错误的import android.R,使用项目自身的R类(IDE通常会自动导入) import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.ArrayAdapter import com.example.vocabquiz.databinding.ActivityMainBinding import java.io.InputStream import java.util.Random import java.util.Scanner class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding private val defns = ArrayList<String>() private lateinit var myadapter : ArrayAdapter<String> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) setupList() // 调用读取文件的方法 readDictionaryFile() binding.definitionsList.setOnItemClickListener { _, _, index, _ -> defns.removeAt(index) myadapter.notifyDataSetChanged() } } // 移到onCreate外作为成员函数 private fun readDictionaryFile() { try { val inputStream: InputStream = resources.openRawResource(R.raw.grewords) // 示例:用Scanner读取文件内容 val scanner = Scanner(inputStream) while (scanner.hasNextLine()) { val line = scanner.nextLine() // 可根据需求处理每行内容,比如添加到列表 println(line) } scanner.close() inputStream.close() } catch (e: Exception) { e.printStackTrace() } } fun setupList() { val list = ArrayList<String>() list.add("Hello") list.add("Rob") list.add("BoBoBo") val rand = Random() val index = rand.nextInt(list.size) val word = list[index] defns.add("a greeting") defns.add("something you say when you are done") defns.add("a dude") defns.add("another name for a duck") defns.add("the President") defns.add("nothing at all") defns.shuffle() myadapter = ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, defns) binding.definitionsList.adapter = myadapter } }
额外提示
resources.openRawResource()方法至今仍有效,并未被废弃,不是方法本身的问题- 处理输入流时建议加try-catch,避免文件读取异常导致程序崩溃
内容的提问来源于stack exchange,提问作者robone
相关产品推荐
相关产品推荐

