Android中如何将EditText的Double值传递至另一个Activity?
问题解决:Intent传递Double报错及优化方案
错误原因分析
- 直接触发报错的原因:
getDoubleExtra()方法必须传入两个参数——键名和默认值,当找不到对应键的数据时会返回这个默认值。你只传了键名,缺少默认值参数,所以编译器抛出"No value passed for parameter 'defaultValue'"错误。 - 隐藏的逻辑问题:你在MainActivity里传递的是EditText的
text属性(类型为Editable),并非Double数值。就算解决了参数问题,第二个Activity也无法解析出正确的Double值,只会拿到默认值。
正确的基础实现方式
1. MainActivity.kt 修正:转换输入为Double再传递
先把EditText的文本转为字符串,再解析成Double,同时处理用户输入无效的情况(比如空值、非数字):
// 获取输入文本并去除首尾空格 val lengthStr = binding.edtTextLength.text.toString().trim() val widthStr = binding.editTextWidth.text.toString().trim() // 转换为Double,捕获格式异常并设置默认值 val length = try { lengthStr.toDouble() } catch (e: NumberFormatException) { 0.0 } val width = try { widthStr.toDouble() } catch (e: NumberFormatException) { 0.0 } // 通过Intent传递Double数值 val intent = Intent(this, MActivity2::class.java) intent.putExtra("Length", length) intent.putExtra("Width", width) startActivity(intent)
2. MActivity2.kt 修正:传入默认值获取参数
调用getDoubleExtra时补充默认值参数:
// 获取传递的Double值,第二个参数为找不到对应键时的默认返回值 val getLength = intent.getDoubleExtra("Length", 0.0) val getWidth = intent.getDoubleExtra("Width", 0.0) // 后续计算逻辑示例 val area = getLength * getWidth val perimeter = 2 * (getLength + getWidth)
更优的传递方式:使用Safe Args(类型安全)
如果想避免手动写键名出错、类型不匹配等问题,可以用Jetpack的Safe Args,它是类型安全的参数传递方案:
- 在项目根目录的
build.gradle中添加Safe Args插件:
plugins { id 'com.android.application' version 'xxx' apply false id 'com.android.library' version 'xxx' apply false id 'org.jetbrains.kotlin.android' version 'xxx' apply false // 添加以下插件 id 'androidx.navigation.safeargs.kotlin' version '2.7.5' apply false }
- 在app模块的
build.gradle中应用插件:
plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' // 应用Safe Args插件 id 'androidx.navigation.safeargs.kotlin' }
- 在导航图(
nav_graph.xml)中定义跳转及参数:
<activity android:id="@+id/mainActivity" android:name="com.example.yourpackage.MainActivity" ...> <action android:id="@+id/action_main_to_mActivity2" app:destination="@id/mActivity2"> <argument android:name="length" app:argType="double" android:defaultValue="0.0"/> <argument android:name="width" app:argType="double" android:defaultValue="0.0"/> </action> </activity> <activity android:id="@+id/mActivity2" android:name="com.example.yourpackage.MActivity2" .../>
- MainActivity中传递参数:
// 转换输入为Double(逻辑同基础实现) val length = ... val width = ... // 使用Safe Args生成的类传递参数 val action = MainActivityDirections.actionMainToMActivity2(length, width) findNavController().navigate(action)
- MActivity2中获取参数:
val args = MActivity2Args.fromIntent(intent) val length = args.length val width = args.width
这种方式完全避免了手动写键名的错误,且类型安全,编译器会自动检查参数类型和完整性。
内容的提问来源于stack exchange,提问作者EJ Lin
相关产品推荐
相关产品推荐

