2010-11-30

mediaplayerを作ってみる(8)-2

続き。string.xmlから。

    <string name="no_title">no title</string>

追加。次、main.xml。レイアウトの一番上に

    <Spinner
        android:id="@+id/spinner"
        android:layout_width="fill_parent"
        android:layout_height="30dp"
        android:background="@color/red">
    </Spinner>

後、TextViewに

android:text="@string/no_title"

追加。なんとなく。次、Activity。

フィールド

private static final String FILE_SEP = File.separator; 削除。

musicListをmusicFileListに変更。名前だけ。
編集→検索/置換で。ただし、すべて置換はやめたほうがいい。

private ArrayList<String> musicDirList;
private MusicListAdapter listAdapter;
private String musicDirName;
private Spinner spinner;

↑4つ追加。そんで、onCreateを

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);
       
        //DirListMakerの生成
        DirListMaker dlm = new DirListMaker();
       
        //spinnerに渡すリストの作成
        ArrayList<String> dirList = new ArrayList<String>();
        dirList.add(SD_PATH);
        musicDirList = dlm.dirListMaker(dirList, "mp3");
       
        //spinnerの取得とArrayAdapterの生成及びセット
        spinner = (Spinner)findViewById(R.id.spinner);
        ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, musicDirList);
       
        spinnerAdapter.setDropDownViewResource(
                android.R.layout.simple_spinner_dropdown_item);

        spinner.setAdapter(spinnerAdapter);
        spinner.setOnItemSelectedListener(this);
       
        //musicFileListの生成
        musicFileList = new ArrayList<String>();
       
        //リストビューの取得と諸々のこと
        listView = (ListView)findViewById(R.id.listView);
        listView.setItemsCanFocus(false);
        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
       
        //クリックされた事を検知。selectedとの違いは分かってません。
        listView.setOnItemClickListener(this);
       
        //musicPlayerの引数に渡すので先に取得
        titleView = (TextView)findViewById(R.id.titleView);

        //musicPlayerの生成とmusicNumの取得
        musicPlayer = new MusicPlayer(titleView);
       
        pauseFlag = false;        //一時停止解除
        changeMusicFlag = false;//曲変更のお知らせ。
       
        //listAdapterの生成
        listAdapter = new MusicListAdapter(this,
                R.layout.rowdata, musicFileList, listView);
       
        //musicList変更用
        flm = new FileListMaker();
    }

こんな↑感じ。それから、

    //これも@Override出来ない。なんか残念。spinnerのイベント処理
    public void onItemSelected(AdapterView<?> parent,
            View view, int position, long id) {

        //選択されたアイテムの取得。
        musicDirName = musicDirList.get(position);
       
        //リストの詰め替え準備
        musicFileList.clear();
        //リストの詰め替え
        flm.fileListMaker(musicDirName, "mp3", musicFileList);
        //listViewの変更
        listView.setAdapter(listAdapter);

        //色々通知。
        musicPlayer.setMusicDir(musicDirName);
        musicPlayer.setMusicList(musicFileList);
        musicPlayer.setListView(listView);
    }

確かこれだけ。後は、MusicPlayer。

フィールドの

    private static final String SD_PATH = //SDのパス
        Environment.getExternalStorageDirectory().getPath();

削除。そんで、コンストラクタを変更してセッター追加。


    public MusicPlayer(TextView tv) {
      
        super();
        titleView = tv;
        musicNum = 0;
      
        super.setOnCompletionListener(this);
    }
  
    public void setMusicList(ArrayList<String> array) {
        musicList = array;
    }
  
    public void setListView(ListView lv) {
        listView = lv;
    }
  
    public void setMusicDir(String name) {
        musicDirName = name;
    }

それから、

listView.setSelection(musicNum - 1);

に変更。これは、なんとなく。見た目の問題。で、最後が

            super.setDataSource(musicDirName
                    + FILE_SEP + musicList.get(musicNum));

に変更。これは、結構重要。やらないと音楽が聴けません。
以上。だと思います。

なんか、段々それなりになってきた様な気がしないでもない。
でもねー。やっぱりねー。前に作ったのと同じ問題発生中。
強制終了になることはない。と思いたい。

ディレクトリAの5曲目を再生中に、ディレクトリBに変えると
Aの6曲目ではなく、Bの6曲目がかかります。
ちなみにBに6曲目がないと・・・。

1曲目に戻ります。そんだけ。
まあ、ぼちぼち修正します。

次は、ディレクトリをまたいでの連続再生。
問題を解消しないままに。たぶん。

追記

    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO 自動生成されたメソッド・スタブ
       
    }

これ、忘れてました。追加しろと言われたので、言われるままに。

0 件のコメント:

コメントを投稿