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

Android Kotlin中Volley解析JSON及Fragment控件空指针问题

问题解决:JSON解析错误与Fragment控件空指针异常

一、JSON解析错误(No value for name)

问题原因

PHP返回的JSON根节点是data,但代码里错误用了user作为键名获取嵌套JSONObject,导致找不到对应节点,进而拿不到name字段,抛出JSONException。

PHP返回的JSON结构:

{"data":{"name":"david","surname":null,"email":"prueba@prueba.com","phone":null,"password":"123456"}}

解决方法

把代码里的jsonObject.getJSONObject("user")改成jsonObject.getJSONObject("data"),正确获取用户数据节点。

修正后的MainActivity登录方法:

private fun login(email: String, password: String) {
    val stringRequest: StringRequest = object : StringRequest(Method.POST, EndPoint.URL,
        Response.Listener { response ->
            try {
                val jsonObject = JSONObject(response)
                // 修正键名:从"user"改为"data"
                val dataJson: JSONObject = jsonObject.getJSONObject("data")
                val name = dataJson.getString("name")
                val intent = Intent(this, ProfileActivity::class.java)
                val b = Bundle()
                b.putString("name", name)
                intent.putExtras(b)
                startActivity(intent)
            } catch (e: JSONException) {
                e.printStackTrace()
            }
        },
        Response.ErrorListener { println("volley Error .................") }) {
        override fun getParams(): Map<String, String>? {
            val params: MutableMap<String, String> = HashMap()
            params["action"] = "login"
            params["email"] = email
            params["password"] = password
            return params
        }
    }
    VolleySingleton.instance?.addToRequestQueue(stringRequest)
}

二、Fragment中EditText空指针异常

问题原因

R.id.userName属于ProfileFragment的布局fragment_profile.xml,但ProfileActivity的布局里没有这个控件,所以在Activity里调用findViewById会返回null,触发空指针。

解决方法

把Activity接收的Bundle数据传递给Fragment,在Fragment里设置EditText文本。

修正后的ProfileActivity代码:

class ProfileActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_profile)
        
        val b = intent.extras
        // 创建Fragment实例并传递数据
        val profileFragment = ProfileFragment()
        profileFragment.arguments = b
        
        // 替换Fragment(需确保activity_profile布局中有id为container的FrameLayout)
        supportFragmentManager.beginTransaction()
            .replace(R.id.container, profileFragment)
            .commit()
    }
}

修正后的ProfileFragment代码:

class ProfileFragment : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view: View = inflater.inflate(R.layout.fragment_profile, container, false)
        val userName = view.findViewById<EditText>(R.id.userName)
        
        // 从arguments中获取传递的name并设置到EditText
        arguments?.let { bundle ->
            val name = bundle.getString("name")
            userName.setText(name)
        }
        
        return view
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 01:06:21