package nliveroid.nlr.main; import java.util.HashMap; import android.content.Context; import android.media.AudioManager; import android.preference.Preference; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.LinearLayout; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; public class SeekBarPreference extends Preference implements OnSeekBarChangeListener { private static SeekBar seekbar; private static SeekBarPreference thisView; private static int MAX_PROGRESS; private Context context; private boolean isEnable = true; private int width; private static AudioManager audio; public SeekBarPreference(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; try{ setWidgetLayoutResource(R.layout.volume_seek); //音量を記憶 thisView = this; audio = (AudioManager)context.getSystemService(context.AUDIO_SERVICE); MAX_PROGRESS = audio.getStreamMaxVolume(AudioManager.STREAM_MUSIC); NLiveRoid app = (NLiveRoid)context.getApplicationContext(); //nullはありえない+参照が同じなのでゲッターのある違うクラス(NLiveRoid)から取得してもOKと想定 width = (int) (app.getViewWidth()); //しばらくするとappのdetailsMapがnullになるのでこのヌルポ if(Details.getPref() != null&& app != null && app.getDetailsMapValue("fix_volenable") != null &&Boolean.parseBoolean(app.getDetailsMapValue("fix_volenable"))){ //有効 thisView.setEnabled(true); isEnable = true; }else{ //コメントオンリー(固定値設定無効ならシークももちろん無効) thisView.setEnabled(false); isEnable = false; } }catch(Exception e){ e.printStackTrace(); if(Details.getPref() != null)Details.getPref().finish(); } } /* * Preference のために、ビューとデータをバインドする * レイアウトからカスタムビューを参照しプロパティを設定するのに適する * スーパークラスの実装の呼び出しを確実に行うこと */ @Override protected void onBindView(View view){ seekbar = (SeekBar) view.findViewById(R.id.volume_seekbar); if (seekbar != null && Details.getPref() != null ) { seekbar.setLayoutParams(new LinearLayout.LayoutParams(width,-2)); seekbar.setMax(MAX_PROGRESS); seekbar.setPadding(10, 30, 50,0); seekbar.setOnSeekBarChangeListener(this); seekbar.setEnabled(isEnable); // seekbar.setOnTouchListener(new OnTouchListener() { // public boolean onTouch(View v, MotionEvent event) { // Boolean b; // if ((int) ((event.getX() / seekbar.getWidth()) * 100) <= seekbar // .getProgress() + 12 // && (int) ((event.getX() / seekbar.getWidth()) * 100) >= seekbar // .getProgress() - 12) { // b = false; // } else { // b = true; // } // return b; // } // }); //初期値を入れる try{ int defaultValue = Integer.parseInt(Details.getPref().getDetailMapValue("fix_volvalue")); //初期値あった場合 seekbar.setProgress(defaultValue); }catch(Exception e){ //初期値なかった場合 今の音量 seekbar.setProgress(audio.getStreamVolume(AudioManager.STREAM_MUSIC)); }//設定値がnullにならないように入れておく NLiveRoid app = (NLiveRoid)context.getApplicationContext(); app.setDetailsMapValue("fix_volvalue", String.valueOf(seekbar.getProgress())); } super.onBindView(view); } @Override public void onStartTrackingTouch(SeekBar seekbar) {}//onTouchactionDown見たいなもん @Override public void onProgressChanged(SeekBar seekbar, int progress, boolean fromUser) { NLiveRoid app = (NLiveRoid)context.getApplicationContext(); app.setDetailsMapValue("fix_volvalue", String.valueOf(progress)); } @Override public void onStopTrackingTouch(SeekBar seekbar) {}//onTouchActionUp見たいなもん public static void setSeekEnable(boolean isEnable){ if(seekbar == null)return; thisView.setEnabled(isEnable); if(isEnable){ //初期値を入れる try{ int defaultValue = Integer.parseInt(Details.getPref().getDetailMapValue("fix_volvalue")); //初期値あった場合 seekbar.setProgress(defaultValue); }catch(Exception e){ //初期値なかった場合 今の音量 seekbar.setProgress(audio.getStreamVolume(AudioManager.STREAM_MUSIC)); } } } }