我使用遊標獲取了歌曲名稱,並將其顯示在第一個活動(MainActivity.java)的列表視圖中。當我點擊列表查看項目時,它會重定向到下一個活動(NextandPrevious.java),並在文本視圖中顯示點擊項目。到目前爲止,一切都很好。但是我在第二個活動中設置了下一個和上一個按鈕。 當我點擊下一個按鈕返回null。如果數組在第一個活動中被分配了一些值,那麼相同的代碼工作正常。嘗試從null數組中讀取 - 嘗試從其他Activity中獲取數組返回null
MainActivity.java
public class MainActivity extends AppCompatActivity {
ListView listView;
List<String>Songs=new ArrayList<>();
int Position,size,take;
public static final int MY_PERMISSION_READ_EXTERNAL_STORAGE=1;
String[] FavouriteActors;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ShowSongList();
}
public void ShowSongList(){
if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
if(ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.READ_EXTERNAL_STORAGE)) {
}else{ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},MY_PERMISSION_READ_EXTERNAL_STORAGE);
}
}else{
getSongs();
FavouriteActors=Songs.toArray(new String[Songs.size()]);
listView=(ListView)findViewById(R.id.lists);
ArrayAdapter<String> adapter=new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,FavouriteActors);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Position=i;
size=listView.getCount();
String Name=String.valueOf(listView.getItemAtPosition(Position));
Intent send=new Intent(getApplicationContext(),NextandPrevious.class);
send.putExtra("position",Position);
send.putExtra("value",Name);
send.putExtra("length",size);
send.putExtra("array",FavouriteActors[Position]);
startActivity(send);
}
});
}
}
public void getSongs(){
try{
ContentResolver c=getContentResolver();
Uri uri=MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor cursor=c.query(uri,null,null,null,null);
if(cursor!=null &&cursor.moveToFirst()){
int song=cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME);
do{
String SongName=cursor.getString(song);
Songs.add(SongName);
}while(cursor.moveToNext());
}cursor.close();
}catch (NumberFormatException e){
e.printStackTrace();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch(requestCode){
case -1:
//hello
break;
case MY_PERMISSION_READ_EXTERNAL_STORAGE:
if(grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
ShowSongList();
}else{
Toast.makeText(getApplicationContext(),"You've denied permission",Toast.LENGTH_LONG).show();
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);}
}
}
NextandPrevious.java
public class NextandPrevious extends Activity implements View.OnClickListener{
ImageButton back,next;
int pos,len;
String val;
TextView show;
String data,nowdata;
public static int mRequestCode=100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_nextand_previous);
back=(ImageButton)findViewById(R.id.back);
next=(ImageButton)findViewById(R.id.next);
show=(TextView)findViewById(R.id.textView);
back.setOnClickListener(this);
next.setOnClickListener(this);
Intent get=getIntent();
pos=get.getExtras().getInt("position");
val=get.getExtras().getString("value");
len=get.getExtras().getInt("length");
nowdata=get.getExtras().getString("array");
show.setText(String.valueOf(nowdata));
}
@Override
public void onClick(View view) {
switch(view.getId()){
case R.id.back:
if(pos==0){
pos=len;
pos=pos-1;
MainActivity job=new MainActivity();
data=job.FavouriteActors[pos];
show.setText(String.valueOf(data));
}
else{
pos=pos-1;
MainActivity job=new MainActivity();
data=job.FavouriteActors[pos];
show.setText(String.valueOf(data));
}
break;
case R.id.next:
pos=pos+1;
MainActivity job=new MainActivity();
String name=job.FavouriteActors[pos];
if(name!=null){
show.setText(name);
}
break;
}
}
}
我的錯誤日誌是:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.cerebri.droids, PID: 667
Theme: themes:{com.cyanogenmod.trebuchet=overlay:system, default=overlay:system, iconPack:system, fontPkg:system, com.android.systemui=overlay:system, com.android.systemui.navbar=overlay:system}
java.lang.NullPointerException: Attempt to read from null array
at com.example.cerebri.droids.NextandPrevious.onClick(NextandPrevious.java:61)
at android.view.View.performClick(View.java:5204)
at android.view.View$PerformClick.run(View.java:21158)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5461)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Application terminated.
請幫助我。
謝謝你的回覆。我會記下你的另一個提示,並嘗試改進。 –
不客氣!如果我的回答幫助您,請立即投票並標記爲已接受。我想贏得一些聲譽:D。 – Cottontree