2017-03-02 36 views
0

我使用遊標獲取了歌曲名稱,並將其顯示在第一個活動(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. 

請幫助我。

回答

0

我想出了這個錯誤。

在MainActivity.java

send.putExtra("array",FavouriteActors[Position]); 

來到NextandPrevious.java改變參數

send.putExtra("array",FavouriteActors); 

而是 「nowdata」 字符串到字符串數組把下面的代碼爲

String[] nowdata=get.getExtras().getStringArray("array"); 

而不是

String nowdata=get.getExtras().getString("array"); 

最後做的onClick下面的變化()NextandPrevious.java

@Override 
public void onClick(View view) { 
    switch(view.getId()){ 
     case R.id.back: 
      if(pos==0){ 
       pos=len; 
       pos=pos-1; 
       show.setText(nowdata[pos]); 
      } 
      else{ 
       pos=pos-1; 

       show.setText(nowdata[pos]); 
      } 
      break; 
     case R.id.next: 
      pos=pos+1; 
      if(pos>=len){ 
       pos=0; 
      } 

      show.setText(nowdata[pos]); 



      break; 
    } 
} 

以前我打電話只是一個字符串,並期待返回數組的方法。顯然它會拋出NPE。

0

的錯誤是

MainActivity job=new MainActivity(); 
data=job.FavouriteActors[pos]; 

你不能只是創建MainActivity對象和期望對象有一個像你以前,你從導航MainActivity相同的數據。您必須像通過其他變量一樣通過Intent將NextandPrevious-Activity傳遞給NextandPrevious-Activity。

另一個提示,瞭解java代碼風格約定,變量命名,縮進等。您的代碼真的很難閱讀。 Camelcase是要走的路。 StyleGuide

+0

謝謝你的回覆。我會記下你的另一個提示,並嘗試改進。 –

+0

不客氣!如果我的回答幫助您,請立即投票並標記爲已接受。我想贏得一些聲譽:D。 – Cottontree

相關問題