2012-07-07 3 views
0

나는 음악을위한 seekbar가있는 안드로이드 응용 프로그램을 만들고 있습니다. 음악 재생 상태를 보여주는 검색 표시 줄이 있는데, 현재 음악 재생 중입니다. 하지만 미디어 플레이어가 트랙에서 특정 장소를 재생할 수 있도록 청취자를 설정하려면 어떻게해야합니까? Mediaplayer에서 재생 시간을 설정하는 코드는 알고 있지만 seekbar에서 클릭 이벤트를 처리하려면 어떻게해야합니까? onClick() 또는 이와 유사한 것은? 고정안드로이드에서 seekbar 사용

: 내 코드 :

package com.mycompany.appname; 

import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

import android.app.ListActivity; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.os.CountDownTimer; 
import android.os.Environment; 
import android.view.KeyEvent; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.SeekBar; 
import android.widget.SeekBar.OnSeekBarChangeListener; 
import android.widget.SlidingDrawer; 

public class MusicActivity extends ListActivity implements OnClickListener, OnSeekBarChangeListener { 
//Called when the activity is first created 
List<String> myList = new ArrayList<String>(); 
EditText AddItemToListViewEditText; 
    static final String[] COUNTRIES = new String[] { 
     "Movies" 
     }; 
    MediaPlayer mp1; 
    String musicUri; 
    Button PausePlay; 
    int positionInt; 
    SlidingDrawer slidingDrawer2; 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.musicscreen); 

    //Import views 
    PausePlay = (Button)findViewById(R.id.PausePlay); 
    slidingDrawer2 = (SlidingDrawer)findViewById(R.id.slidingDrawer2); 

    //Setup onClickListener for the buttons 
    PausePlay.setOnClickListener(this); 

    //Setup mediaPlayer 
    mp1 = new MediaPlayer(); 

    //Setup ListView 
    setListAdapter((ListAdapter) new ArrayAdapter<String>(this, R.layout.list_item, COUNTRIES)); 
    setListAdapter((ListAdapter) new ArrayAdapter<String>(this, R.layout.list_item, myList)); 

    //Setup seekBar 
    final SeekBar progress = (SeekBar)findViewById(R.id.musicProgressBar); 
    progress.setOnSeekBarChangeListener(this); 

    ListView lv = getListView(); 
    lv.setTextFilterEnabled(true); 

    File mFile = new File(Environment.getExternalStorageDirectory() + "/Music/"); 
    myList.addAll(Arrays.asList(mFile.list())); 
    setListAdapter((ListAdapter) new ArrayAdapter<String>(this, R.layout.list_item, myList)); 

    lv.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, 
      int position, long id) { 
     //When an item is clicked, play it on a MediaPlayer 
      //Play song 
      positionInt = position; 
      if (mp1.isPlaying()) { 
       //Reset mediaPlayer 
       mp1.reset(); 
       try { 
        musicUri = Environment.getExternalStorageDirectory() + "/Music/" + myList.get(positionInt); 
       mp1.setDataSource(musicUri); 
       mp1.prepare(); 
       mp1.start(); 
       slidingDrawer2.animateOpen(); 
      } catch (IllegalArgumentException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IllegalStateException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      } else { 
      try { 
       musicUri = Environment.getExternalStorageDirectory() + "/Music/" + myList.get(position); 
      mp1.setDataSource(musicUri); 
      mp1.prepare(); 
      mp1.start(); 
      slidingDrawer2.animateOpen(); 
     } catch (IllegalArgumentException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

      //Setup seekBar 
      final SeekBar progress = (SeekBar)findViewById(R.id.musicProgressBar); 
      progress.setProgress(0); 
      progress.setMax(mp1.getDuration()); 
      new CountDownTimer(mp1.getDuration(), 250) { 
      public void onTick(long millisUntilFinished) { 
       if (progress.getProgress() == mp1.getDuration()) { 
        mp1.reset(); 
        progress.setProgress(0); 
       } else { 
        progress.setProgress(mp1.getCurrentPosition()); 
       } 
      } 
      public void onFinish() {} 
      }.start(); 
     } 
    } 
    }); 
} 

@Override 
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
    if (fromUser == true) { 
     mp1.seekTo(seekBar.getProgress()); 
    } else { 
     //Do nothing 
    } 
} 

@Override 
public boolean onKeyDown(int KeyCode, KeyEvent event) { 
    if ((KeyCode == KeyEvent.KEYCODE_BACK)) { 
     if (mp1.isPlaying()) { 
      mp1.reset(); 
      System.exit(0); 
     } else { 
      finish(); 
     } 
     return true; 
    } 
    return super.onKeyDown(KeyCode, event); 
} 

public void onClick(View src) { 
    switch(src.getId()) { 
    case R.id.PausePlay: 
     if (mp1.isPlaying()) { 
      mp1.pause(); 
      PausePlay.setText("Play"); 
     } else { 
      mp1.start(); 
      PausePlay.setText("Pause"); 
     } 
     break; 
    } 
} 

@Override 
public void onStartTrackingTouch(SeekBar seekBar) { 
    // TODO Auto-generated method stub 
} 

@Override 
public void onStopTrackingTouch(SeekBar seekBar) { 
    // TODO Auto-generated method stub 
} 
} 

내 XML은 :

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" > 


<TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Musikk" 
    android:textAppearance="?android:attr/textAppearanceLarge" /> 

<FrameLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" > 




    <ListView 
     android:id="@+android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" > 

    </ListView> 


    <SlidingDrawer 
     android:id="@+id/slidingDrawer2" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:content="@+id/content" 
     android:handle="@+id/handle" > 


     <Button 
      android:id="@+id/handle" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Spiller nå" /> 


     <LinearLayout 
      android:id="@+id/content" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:orientation="vertical" > 


      <SeekBar 
       android:id="@+id/musicProgressBar" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" /> 

      <LinearLayout 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" > 













       <Button 
        android:id="@+id/PausePlay" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="Pause" /> 

      </LinearLayout> 

     </LinearLayout> 
    </SlidingDrawer> 

</FrameLayout> 

</LinearLayout> 
+0

으로 OnSeekBarChanged 리스너를 등록하는 것을 잊지 마세요 http://docs.oracle .com/javase/tutorial/java/nutsandbolts/variables.html). 특히 그 페이지의 마지막 글 머리 기호. PausePlay 변수와 같은 최종 변수가 아닌 변수는 소문자로 시작해야합니다. 대문자로 시작하는 Camelcase는 클래스 용으로 예약해야합니다. –

답변

0

그런 다음, SeekBar.OnSeekBarChangeListener을 구현하는 onProgressChanged 메소드를 구현하는 것이 좋습니다.

이것은 진행 상황이 변경 될 때 (예 : 사용자가 탐색 모음의 어딘가를 클릭하는 경우) 호출되며 새 위치를 제공합니다.

예 :

public void onProgressChanged (SeekBar seekBar, int progress, boolean fromUser) { 
    // Do something 
} 

또한합니다 ([자바 변수 명명 규칙]을 체크 아웃해야 seekBar.setOnseekBarChangeListener

+1

방법을 쓸 수 있을까요? – user1446632

+0

그 링크를 보았습니까? 필요한 모든 것이 있어야합니다. 답안을 예제 방법으로 업데이트했습니다. 그래도 그다지 익숙하지 않으므로 개발자 문서에서 메서드를 복사하여 나에게 무엇을 기대할 수 있는지 잘 모르겠습니다. –

+0

메서드를 재정의해야합니까? – user1446632

0
public void onProgressChanged(SeekBar seekBar, int progress, 
        boolean fromUser) { 
       // TODO Auto-generated method stub 
       if (fromUser) { 
        mp1.seekTo(progress); 
        seekBar.setProgress(progress); 
       } 

      }