2013-09-03 2 views
0

나는 MediaPlayer 개체와 모든 노래가 sd 카드에있는 회 전자가 있습니다. 각 재생, 일시 중지, 정지, 이전 및 다음 버튼의 코드를 만들려고합니다.android spinner.setSelection (position, false); 실행되지 않았습니다

회 전자에서 항목을 선택하면 MediaPlayer를 가져와 해당 데이터 소스를 설정하고 준비 메서드를 호출합니다. 여기에 코드입니다 :

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 

     @Override 
     public void onItemSelected(AdapterView<?> arg0, View arg1, 
       int arg2, long arg3) { 

      Context context = getApplicationContext(); 
      CharSequence text = "onItemSelected"; 
      int duration = Toast.LENGTH_SHORT; 

      Toast toast = Toast.makeText(context, text, duration); 
      toast.show(); 

      try { 
       mediaPlayer.reset(); 
       mediaPlayer.setDataSource(sdcard_playlist.get(arg2)); 
       applyValuesToEqualizer(); 
       mediaPlayer.prepare(); 
       index = arg2; 



      } catch (IllegalArgumentException e1) { 
       e1.printStackTrace(); 
      } catch (SecurityException e1) { 
       e1.printStackTrace(); 
      } catch (IllegalStateException e1) { 
       e1.printStackTrace(); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> arg0) { 
     } 
    }); 

그리고 여기에 각각의 정지 및 다음 버튼에 대한 코드입니다 :

public void stopSong(View view) { 
    if (isPlaying) { 
    mediaPlayer.reset(); 

    isPlaying = false; 
    spinner.setSelection(index, false); // index is the index of the chosen item from spinner 
    seekbar.setProgress(0); 
    } 
} 

public void nextSong(View view) { 
    if (isPlaying) { 
     mediaPlayer.reset(); 
     isPlaying = false; 
     spinner.setSelection(index + 1, false); 
     seekbar.setProgress(0); 
     playPauseSong(findViewById(R.id.pause_music_button)); 
    } else { 
     spinner.setSelection(index + 1, false); 
     seekbar.setProgress(0); 
    } 
} 

무엇인가 일어나고있는 것은 nextSong()가 호출 될 때, 모든 것이 잘 작동하는지이고 onItemSelected의 토스트()가 표시되지만 stopSong()이 호출되면 onItemSelected()가 실행되지 않고 토스트가 표시되지 않고 노래가 중지되지만 재생 버튼을 다시 클릭하면 예외가 발생합니다. 상태 1에서 호출이 시작됩니다. , 오류 (-38, 0)입니다. mediaPlayer가 재설정되고 다시 준비되지 않았기 때문입니다. 나는 이미 선택되어 스피너에서 항목을 선택하고있어 경우, spinner.setSelection(index, false); 다시 onItemSelected를 호출하지 않습니다 사전 :

+0

재설정 후 미디어 플레이어가 mp.prepare();를 호출하려고합니다. – Piyush

+0

하지만 onItemSelected에서이 함수를 호출하고 있는데, 왜 nextSong()에서 호출되고 stopSong()에서 호출되지 않는 것입니까? – Hanady

+0

당신이 onItemselect를 호출하면 Spinner의 인덱스를 true로 지정합니다. – Piyush

답변

1

시도 index이 변경된 경우에만 호출됩니다.

내가 변수 문자열을 작성 dataSource에 값을 설정 : 그래서 나는 다음 한 onItemSelected

private String dataSource; 

,이 추가 :

mediaPlayer.reset(); 
dataSource = sdcard_playlist.get(arg2); 
mediaPlayer.setDataSource(dataSource); 
applyValuesToEqualizer(); 
mediaPlayer.prepare(); 
index = arg2; 

그래서 stopSong() 방법이되었다 :

public void stopSong(View view) { 
    if (mediaPlayer.isPlaying()) { 
     mediaPlayer.reset(); 
     try { 
      mediaPlayer.setDataSource(dataSource); 
      applyValuesToEqualizer(); 
      mediaPlayer.prepare(); 
     } catch (IOException e) { 
      Log.e(TAG, "Error in stopSong() method"); 
     } 
     isPlaying = false; 

     seekbar.setProgress(0); 
    } 
} 
0
new Handler().postDelayed(new Runnable() {   
       public void run() { 
        spinner.setSelection(index, false); 
       } 
       }, 100); 

에서

덕분에이

내가 문제를 해결 한
관련 문제