Kotlin Android文件选择器按钮点击崩溃问题求助
问题分析与解决方案
核心崩溃原因
你手动实例化了FileLoading这个Activity类(val fileLoader = FileLoading()),这是Android开发的大忌——Activity的实例必须由系统创建和管理,手动new出来的Activity没有经过系统初始化,内部上下文等核心对象都是null,调用startActivityForResult时必然触发空指针异常。
正确实现方式(基于Jetpack Compose)
不需要单独创建Activity类,也不用修改MainActivity的父类(ComponentActivity完全够用),直接用AndroidX提供的Activity Result API来实现文件选择,这是当前推荐的现代写法,替代过时的startActivityForResult。
修改后的完整代码
class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { MyProjectTheme { Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { MyApp() } } } } } @Composable fun MyApp() { // 注册文件选择的Activity Result回调 val pickFileLauncher = rememberLauncherForActivityResult( contract = ActivityResultContracts.GetContent() ) { uri: Uri? -> uri?.let { selectedUri -> // 这里处理选中的CSV文件URI,比如读取文件内容 val inputStream = LocalContext.current.contentResolver.openInputStream(selectedUri) // 后续添加CSV解析逻辑... } } Column( modifier = Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { Button(onClick = { // 启动文件选择器,指定CSV类型更精准,兼容文本文件可改用"text/plain" pickFileLauncher.launch("text/csv") }) { Text(stringResource(R.string.load_button), fontSize = 24.sp) } } }
关键说明
rememberLauncherForActivityResult是Compose中专门处理Activity结果的API,自动和Composable生命周期绑定,无需手动写onActivityResult。- 指定MIME类型为
text/csv可精准筛选CSV文件,若需兼容所有文本文件,保留text/plain即可。 - 选中文件后得到的是
Uri,通过ContentResolver读取文件内容是Android 10+的推荐方式,避免直接操作文件路径的权限问题。
额外提示
不需要使用ActivityMainBinding,当前写法完全适配Compose开发场景。如果需要解析CSV内容,可使用OpenCSV等第三方库简化开发,或自行实现基础解析逻辑。
内容的提问来源于stack exchange,提问作者Whatzat
相关产品推荐
相关产品推荐

