起因:java。lang.NullPointerException:尝试调用虚拟方法“void”。小装置。列表视图。空对象引用上的setAdapter
显示活动。爪哇
我对安卓系统比较陌生。我正在尝试创建一个包含音乐的列表视图。该应用程序是完美构建的,但当我尝试在设备上运行它时,它崩溃了。我试图调试应用程序,但它给了我上述错误。下面是我的代码
package com.bytetex.azmusic;
import 安卓x.appcompat.app.AppCompatActivity;
import 安卓.Manifest;
import 安卓.os.Bundle;
import 安卓.os.Environment;
import 安卓.widget.ArrayAdapter;
import 安卓.widget.ListView;
import com.karumi.dexter.Dexter;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionDeniedResponse;
import com.karumi.dexter.listener.PermissionGrantedResponse;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.single.PermissionListener;
import java.io.File;
import java.util.ArrayList;
public class DisplayActivity extends AppCompatActivity {
private String[] itemsAll;
private ListView mSongsLists;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display);
appExternalStorageStoragePermission();
mSongsLists=findViewById(R.id.songLists);
}
public void appExternalStorageStoragePermission() {
Dexter.withContext(this)
.withPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
.withListener(new PermissionListener() {
@Override
public void onPermissionGranted(PermissionGrantedResponse response) {
dispalyAudioSongName();
}
@Override
public void onPermissionDenied(PermissionDeniedResponse response) {
}
@Override
public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
token.continuePermissionRequest();
}
}).check();
}
public ArrayList<File> readOnluAudioSongs(File file) {
ArrayList<File> arrayList = new ArrayList<>();
File[] allFiles = file.listFiles();
assert allFiles != null;
for (File individualFile : allFiles) {
if (individualFile.isDirectory() && !individualFile.isHidden()) {
arrayList.addAll(readOnluAudioSongs(individualFile));
} else {
if (individualFile.getName().endsWith(".mp3") || individualFile.getName().endsWith(".aac") || individualFile.getName().endsWith(".wav") || individualFile.getName().endsWith(".wma")) {
{
arrayList.add(individualFile);
}
}
}
}
return arrayList;
}
private void dispalyAudioSongName()
{
final ArrayList<File> audioSong= readOnluAudioSongs(Environment.getExternalStorageDirectory());
itemsAll=new String[audioSong.size()];
for (int songCounter=0; songCounter<audioSong.size(); songCounter++)
{
itemsAll[songCounter]=audioSong.get(songCounter).getName();
}
ArrayAdapter<String> arrayAdapter=new ArrayAdapter<String>(DisplayActivity.this, 安卓.R.layout.simple_list_item_1, itemsAll);
mSongsLists.setAdapter(arrayAdapter);
}
}
活动显示。xml
这是我的xml代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:安卓="http://schemas.安卓.com/apk/res/安卓"
xmlns:app="http://schemas.安卓.com/apk/res-auto"
xmlns:tools="http://schemas.安卓.com/tools"
安卓:layout_width="match_parent"
安卓:layout_height="match_parent"
tools:context=".DisplayActivity">
<ListView
安卓:id="@+id/songLists"
安卓:layout_width="match_parent"
安卓:layout_height="match_parent">
</ListView>
</RelativeLayout>
# 1 楼答案
在dispalyAudioSongName()方法中调用“mSongsLists”上的setAdapter()方法之前,mSongsLists变量已声明,但从未与值关联
在onCreate()方法中,您正在调用appExternalStorageStoragePermission(),它在内部调用dispalyAudioSongName(),此时MSOngsList为null
要解决这个问题,可以先设置“mSongsLists”,然后调用appExternalStorageStoragePermission()方法