在試圖每次我想要一個搜索欄和相應的TextView時間寫少一點的代碼顯示它的數值,我寫了下面的抽象類:最小化setOnSeekBarChangeListener樣板
abstract public class SeekBarWrapper {
SeekBar bar;
TextView valueText;
int value = 0;
int minValue;
int divisor;
public SeekBarWrapper(SeekBar sb, TextView tv, int value, int minValue,
int divisor){
this.bar = sb;
this.valueText = tv;
this.value = value;
this.minValue = minValue;
this.divisor = divisor;
setListener();
}
private void setListener(){
bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) { }
@Override
public void onStartTrackingTouch(SeekBar seekBar) { }
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
if(!fromUser) return;
value = progress + minValue;
valueText.setText(Integer.toString(value/divisor));
sendValue();
}
});
}
abstract protected void sendValue();
public void updateValue(int newValue){
if(newValue == value) return;
value = newValue;
valueText.setText(Integer.toString(value));
bar.setProgress(value*divisor-minValue);
}
}
對於每個具體的搜索欄我LL寫一個嵌套類,例如:
class VolumeBarWrapper extends SeekBarWrapper{
public VolumeBarWrapper(SeekBar s, TextView t, int v, int min, int div){
super(s, t, v, min, div);
}
public void sendValue(){
someCallback.volume(this.value);
}
}
和實例,像這樣:
VolumeBarWrapper volume;
// later:
volume = new VolumeBarWrapper((SeekBar) view.findViewById(R.id.volume_bar),
(TextView) view.findViewById(R.id.volume_value), 300, 0, 70);
這是功能性的,看起來有所改進。我想知道的是:
- 是否有某種方法可以使其成爲匿名內部類或其他方法來進一步壓縮每個實例的代碼? 而不那麼緊迫:
- 我濫用「包裝」標籤嗎?它在模式說話方面沒有一些專門的含義嗎?
- 從OOP的角度來看,這種設計是否「不好」(我仍然試圖在這方面自學)?
我最終被上述與包裝的具體版本去一個自定義監聽器,如下所述。這使用SeekBar和VerticalSeekBar無縫,而擴展的SeekBar,我將不得不爲每個SeekBar的子類,並更改XML中的引用。 – anthropomo