You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,它是类型安全的参数传递方案:

  1. 在项目根目录的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
}
  1. 在app模块的build.gradle中应用插件:
plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    // 应用Safe Args插件
    id 'androidx.navigation.safeargs.kotlin'
}
  1. 在导航图(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"
    .../>
  1. MainActivity中传递参数:
// 转换输入为Double(逻辑同基础实现)
val length = ... 
val width = ...

// 使用Safe Args生成的类传递参数
val action = MainActivityDirections.actionMainToMActivity2(length, width)
findNavController().navigate(action)
  1. MActivity2中获取参数:
val args = MActivity2Args.fromIntent(intent)
val length = args.length
val width = args.width

这种方式完全避免了手动写键名的错误,且类型安全,编译器会自动检查参数类型和完整性。

内容的提问来源于stack exchange,提问作者EJ Lin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 18:42:17