Android Studio中Intent传递Activity数据触发空指针异常问题
解决Intent传递数据及NullPointerException问题
首先,你的NullPointerException出现在listView.getItemAtPosition(position).toString()这一行,主要原因有两个:
listView.getItemAtPosition(position)可能返回null(比如ListView的adapter绑定有延迟,或者数据初始化顺序存在隐藏问题)- 你的
BaiHat类没有重写toString()方法,即使获取到对象,默认的toString()也不会返回你需要的歌曲名称。
另外,你的SecondActivity里也存在几处逻辑错误,我会一并修复。
第一步:修复MainActivity的点击事件
直接使用你已经初始化好的baiHatArrayList来获取点击的对象,这比从ListView取更可靠,同时正确获取歌曲名称:
修改MainActivity的onItemClick方法:
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 直接从列表中获取点击的歌曲对象 BaiHat clickedSong = baiHatArrayList.get(position); // 获取正确的歌曲名称 String ten_bai_hat = clickedSong.getTenBaiHat(); Intent intent = new Intent(MainActivity.this, SecondActivity.class); // 传递Parcelable类型的列表 intent.putParcelableArrayListExtra("BAIHAT", baiHatArrayList); intent.putExtra("TENBAIHAT", ten_bai_hat); intent.putExtra("POSITION", position); startActivity(intent); } });
第二步:修复SecondActivity的逻辑错误
你的SecondActivity存在两个关键问题:
- 先使用默认的
vi_tri=0获取列表数据,再从intent中读取正确的position,顺序颠倒 - 使用
Uri.parse(baiHatArrayList.get(vi_tri).toString())初始化MediaPlayer完全错误,因为BaiHat的toString()不是Uri,应该直接使用资源id
修改后的SecondActivity代码:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); txtlaydulieu = findViewById(R.id.textViewlaydulieu); Intent intent = getIntent(); // 先获取点击的位置,再处理其他数据 vi_tri = intent.getIntExtra("POSITION", 0); // 获取传递过来的歌曲列表 baiHatArrayList = intent.getParcelableArrayListExtra("BAIHAT"); // 获取歌曲名称(可以选择从intent取,或者从列表中取,后者更可靠) String songName = intent.getStringExtra("TENBAIHAT"); // 可选:从列表中直接获取,避免字符串传递的潜在问题 // String songName = baiHatArrayList.get(vi_tri).getTenBaiHat(); txtlaydulieu.setText(songName); txtlaydulieu.setSelected(true); // 获取音频资源的id,直接传给MediaPlayer int audioResId = baiHatArrayList.get(vi_tri).getTenFile(); MediaPlayer mediaPlayer = MediaPlayer.create(getApplicationContext(), audioResId); mediaPlayer.start(); }
可选优化:给BaiHat类重写toString()
如果你以后需要直接打印或者在ListView中显示BaiHat对象的名称,可以给BaiHat类添加toString()方法:
@Override public String toString() { return tenBaiHat; }
这样修改后,你的NullPointerException问题会被解决,同时SecondActivity的音频播放也能正常工作。
内容的提问来源于stack exchange,提问作者nguyen van thang
相关产品推荐
相关产品推荐

