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
相关产品推荐
相关产品推荐

