結構変更。いろんなとこを。まずは、selector。checkboxの。
この間、色々拾ってきたんで。元のcheckboxがいやだったし。
参考サイト Android Wiki* の
ボタンの画像変更(CheckBox,RadioButton)
checkbox_selector.xml
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_checked="true"
android:state_pressed="true"
android:drawable="@drawable/free2you5" />
<item
android:state_checked="true"
android:drawable="@drawable/free2you1" />
<item
android:state_checked="false"
android:state_pressed="true"
android:drawable="@drawable/free2you5" />
<item
android:state_checked="false"
android:drawable="@drawable/free2you6" />
</selector>
上から
チェックされてて、押された状態
チェックされてる状態
チェックされてなくて、押された状態
チェックされていない状態
それぞれの状態のbutton(icon)を設定。
色々試した結果、32x32とxmlをdrawable-mdpiに。まあ、お好みで。
上から1番目と3番目(押された状態)は、同じ画像を使ってます。まあ、お好みで。
ほいで、style。res/valuesに。
checkbox_style.xml
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<style name="custom_checkbox" parent="android:Widget.CompoundButton.CheckBox">
<item name="android:button">@drawable/checkbox_selector</item>
</style>
</resources>
で、main.xml。skipボタンの列に。skipボタンもまとめて。
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal">
<CheckBox
android:id="@+id/repeatButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:text="@string/repeat_button"
android:textColor="@color/green"
android:layout_marginLeft="10dp"
style="@style/custom_checkbox">
</CheckBox>
<CheckBox
android:id="@+id/shuffleButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:text="@string/shuffle_button"
android:textColor="@color/green"
android:layout_marginLeft="10dp"
style="@style/custom_checkbox">
</CheckBox>
<Button
android:id="@+id/skipButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/skip_button"
android:onClick="onClickSkip"
android:layout_marginLeft="10dp">
</Button>
</LinearLayout>
shuffle用もまとめて追加。どうせつけるんで。
表示する文字は、まあ、お好みで。
で、こんな↓感じ。
eclipseで、画面キャプチャ出来るとは。知りませんでした。
一応メモ。DDMS→Devices→スクリーンのキャプチャー
便利だ。それはそれとして、次はMusicDirListMaker。作り変えました。
package net.asasvata.listmaker;
import java.io.File;
import java.util.ArrayList;
public class MusicDirListMaker {
private final String FILE_SEP = File.separator;
public void musicDirListMaker(ArrayList<String> list1, ArrayList<String> list2) {
int m = 0; int n = 0;
while (list1.size() > m) {
File subDir = new File(list1.get(m));
try {
String[] subFileName = subDir.list();
n = 0;
while (subFileName.length > n) {
File subFile = new File(subDir.getPath() +
FILE_SEP + subFileName[n]);
if (subFile.isDirectory()) {
list1.add(subDir.getPath() + FILE_SEP + subFileName[n]);
} else if (subFile.isFile() &&
(subFile.getName().endsWith("mp3") ||
subFile.getName().endsWith("wav"))) {
if (!list2.contains(list1.get(m))) {
list2.add(list1.get(m));
}
}
n++;
}
} catch (NullPointerException e) {
}
m++;
}
}
}
Exceptionは、dirListMakerと同じ理由でほったらかし。いいのだろうか。
endWith()で拡張子をみてるので、追加、削除はまあ、お好みで。
あと、voidになってます。なんとなく。MusicFileListMakerもつくりました。
package net.asasvata.listmaker;
import java.io.File;
import java.util.ArrayList;
public class MusicFileListMaker {
private final String FILE_SEP = File.separator;
public void musicFileListMaker(String name, ArrayList<String> list) {
list.clear();
File musicFile = new File(name);
String[] musicFileList = musicFile.list();
for (String fileName : musicFileList) {
File file = new File(name + FILE_SEP + fileName);
if (file.isFile() && (fileName.endsWith("mp3") ||
fileName.endsWith("wav"))) {
list.add(fileName);
}
}
}
}
"mp3"って書くのが、面倒なんで。wavはなんとなく。要らないような気も。
あと、何気なく list.clear()。 そのうちまた変わるかも。まあ、適当に。
次は、MusicPlayer。フィールドに
private SDMediaPlayerActivity sdmp;
private CheckBox repeatButton;
2個追加。で、コンストラクタの引数に
SDMediaPlayerActivity sdmp 追加。1つ目に。
コンストラクタの中に、
this.sdmp = sdmp; 追加。
そいで、
public void setRepeatButton(CheckBox cb) {
repeatButton = cb;
}
public void onCompletion(MediaPlayer mp) {
if (++musicNum < musicList.size()) {
playMusic();
} else {
musicNum = 0;
if (repeatButton.isChecked()) {
playMusic();
} else {
if (++dirNum < dirList.size()) {
if (dirNum - 1 == sdmp.getSpinnerPosition()) {
setSpinnerAndListView();
}
sdmp.getMflm().musicFileListMaker(dirList.get(dirNum), musicList);
playMusic();
} else {
if (dirNum - 1 == sdmp.getSpinnerPosition()) {
dirNum = 0;
setSpinnerAndListView();
}
dirNum = 0;
sdmp.getMflm().musicFileListMaker(dirList.get(dirNum), musicList);
playMusic();
}
}
}
}
//spinner表示変更
public void setSpinnerAndListView() {
sdmp.getSpinner().setSelection(dirNum);
sdmp.getMflm().musicFileListMaker(dirList.get(dirNum), sdmp.getFlfv());
listView.setAdapter(sdmp.getAdapter());
}
こんだけ追加と、変更。ほいから、Activity。
フィールド
private FileListMaker flm; 削除。
private MusicFileListMaker mflm; 追加。
private int spinnerPosition; 変更。(static削除)
private String musicDirName; 削除。
private CheckBox repeatButton; 追加。
onCreate内、
musicDirList = new ArrayList<String>(); ↓の上に追加。
mdlm.musicDirListMaker(dirList, musicDirList); 変更。(引数追加)
↓は、この位置関係で。ちょっとおかしいかもしれませんが。
//CheckBoxの取得
repeatButton = (CheckBox)findViewById(R.id.repeatButton); 追加。
//musicPlayerの生成とmusicNumの取得
musicPlayer = new MusicPlayer(this,titleView); 引数変更。
musicPlayer.setRepeatButton(repeatButton); 追加。
これも忘れず。
flm = new FileListMaker(); 削除。
mflm = new MusicFileListMaker(); 追加。
次、onItemSelected内、
musicDirName = musicDirList.get(position); 削除。
fileListForListView.clear(); 削除。
flm.fileListMaker(musicDirName, "mp3", fileListForListView); 削除。
mflm.musicFileListMaker(musicDirList.get(position),
fileListForListView); 追加。
if (musicFileList == null) {
musicFileList = new ArrayList<String>();
mflm.musicFileListMaker(musicDirList.get(position), musicFileList);
}
↑変更。そいで、結構な変更。
//戻る
public void onClickBack(View view) {
int n = musicPlayer.getMusicNum() - 1;//とりあえず減らす
if (n < 0) {
if (repeatButton.isChecked()) {
n = musicPlayer.getMusicList().size() - 1;//最後の曲を指定
musicPlayer.setMusicNum(n);
if (musicPlayer.isPlaying()) musicPlayer.playMusic();
else setTitle();
} else {
int num = musicPlayer.getDirNum() - 1;
if (num < 0) {
if (num + 1 == spinnerPosition) {
num = musicDirList.size() - 1;
setSpinnerAndListView(num);
}
num = musicDirList.size() - 1;
musicPlayer.setDirNum(num);
mflm.musicFileListMaker(musicDirList.get(num), musicFileList);
n = musicPlayer.getMusicList().size() - 1;//最後の曲を指定
musicPlayer.setMusicNum(n);
if (musicPlayer.isPlaying()) musicPlayer.playMusic();
else setTitle();
} else {
if (num + 1 == spinnerPosition) {
setSpinnerAndListView(num);
}
musicPlayer.setDirNum(num);
mflm.musicFileListMaker(musicDirList.get(num), musicFileList);
n = musicPlayer.getMusicList().size() - 1;//最後の曲を指定
musicPlayer.setMusicNum(n);
if (musicPlayer.isPlaying()) musicPlayer.playMusic();
else setTitle();
}
}
} else {
musicPlayer.setMusicNum(n);
if (musicPlayer.isPlaying()) musicPlayer.playMusic();
else setTitle();
}
}
//進む
public void onClickNext(View view) {
int n = musicPlayer.getMusicNum() + 1;//とりあえず増やす。
if (n < musicPlayer.getMusicList().size()) {
musicPlayer.setMusicNum(n);
if (musicPlayer.isPlaying()) musicPlayer.playMusic();
else setTitle();
} else {
n = 0;//1曲目を指定
musicPlayer.setMusicNum(n);
if (repeatButton.isChecked()){
if (musicPlayer.isPlaying()) musicPlayer.playMusic();
else setTitle();
} else {
int num = musicPlayer.getDirNum() + 1;
if (num < musicDirList.size()) {
if (num - 1 == spinnerPosition) {
setSpinnerAndListView(num);
}
musicPlayer.setDirNum(num);
mflm.musicFileListMaker(musicDirList.get(num), musicFileList);
if (musicPlayer.isPlaying()) musicPlayer.playMusic();
else setTitle();
} else {
if (num - 1 == spinnerPosition) {
num = 0;
setSpinnerAndListView(num);
}
num = 0;
musicPlayer.setDirNum(num);
mflm.musicFileListMaker(musicDirList.get(num), musicFileList);
if (musicPlayer.isPlaying()) musicPlayer.playMusic();
else setTitle();
}
}
}
}
次は、地味に変更。
public int getSpinnerPosition() {
return spinnerPosition;
}
staticを外しただけ。も一つ地味に。setAndPlayMusic内、
if (spinnerPosition != musicPlayer.getDirNum()) {
mflm.musicFileListMaker(musicDirList.get(spinnerPosition), musicFileList);
musicPlayer.setDirNum(spinnerPosition);
}
最後に、
private void setSpinnerAndListView(int num) {
spinner.setSelection(num);
mflm.musicFileListMaker(musicDirList.get(num), fileListForListView);
listView.setAdapter(listAdapter);
}
追加。たぶん、これだけ。
次は、shuffle。ボタンもつけたし。