Java 最小化SetOnSeekbarchangListener样板

Java 最小化SetOnSeekbarchangListener样板,java,android,abstract,inner-classes,Java,Android,Abstract,Inner Classes,为了在每次需要SeekBar和显示其数值的相应TextView时编写更少的代码,我编写了以下抽象类: 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 div

为了在每次需要SeekBar和显示其数值的相应TextView时编写更少的代码,我编写了以下抽象类:

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);
}

}
对于每个具体的SeekBar,我将编写一个嵌套类,例如:

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);
它的功能,似乎是一个进步。我想知道的是:

  • 是否有某种方法使其成为匿名内部类,或者有另一种方法进一步压缩每个实例的代码? 不那么紧迫的是:
  • 我是否滥用了“包装器”标签,它在模式语言中是否有特殊意义
  • 从面向对象的角度来看,这种设计“糟糕”吗(我仍在努力学习这方面的知识)
  • 您始终可以制作一个更好的
    SeekBar
    ,并在任何地方使用它:

    public class VersatileSeekBar extends SeekBar implements SeekBar.OnSeekBarChangeListener {
        private TextView mTextView;
        private ChangeHandler mChangeHandler;
    
        public void bindDisplayToChange(TextView textView,ChangeHandler handler) {
            mTextView = textView;
            mChangeHandler = handler;
        }
    
        public VersatileSeekBar(Context context) {
            super(context);
            init();
        }
    
        public VersatileSeekBar(Context context, AttributeSet attrs) {
            super(context, attrs);
            init();
        }
    
        public VersatileSeekBar(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            init();
        }
    
    
        @Override
        public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
            if(mChangeHandler != null && mTextView != null){
                mChangeHandler.onChange(i,mTextView);
            }
        }
    
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
        }
    
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
        }
    
        private void init(){
            this.setOnSeekBarChangeListener(this);
        }
    
        public static abstract class ChangeHandler{
            public abstract void onChange(int value,TextView textView);
        }
    }
    
    要调用的代码:

    myVersatileSeekBar.bindDisplayToChange(myTextView, new VersatileSeekBar.ChangeHandler() {
                @Override
                public void onChange(int value, TextView textView) {
                    textView.setText("level :" + value * 100);
                }
            });
    
    您始终可以制作一个更好的
    SeekBar
    ,并在任何地方使用它:

    public class VersatileSeekBar extends SeekBar implements SeekBar.OnSeekBarChangeListener {
        private TextView mTextView;
        private ChangeHandler mChangeHandler;
    
        public void bindDisplayToChange(TextView textView,ChangeHandler handler) {
            mTextView = textView;
            mChangeHandler = handler;
        }
    
        public VersatileSeekBar(Context context) {
            super(context);
            init();
        }
    
        public VersatileSeekBar(Context context, AttributeSet attrs) {
            super(context, attrs);
            init();
        }
    
        public VersatileSeekBar(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            init();
        }
    
    
        @Override
        public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
            if(mChangeHandler != null && mTextView != null){
                mChangeHandler.onChange(i,mTextView);
            }
        }
    
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
        }
    
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
        }
    
        private void init(){
            this.setOnSeekBarChangeListener(this);
        }
    
        public static abstract class ChangeHandler{
            public abstract void onChange(int value,TextView textView);
        }
    }
    
    要调用的代码:

    myVersatileSeekBar.bindDisplayToChange(myTextView, new VersatileSeekBar.ChangeHandler() {
                @Override
                public void onChange(int value, TextView textView) {
                    textView.setText("level :" + value * 100);
                }
            });
    

    我的抽象类的一个关键特性是能够在onProgressChanged方法中调用可重写的抽象方法。是否有某种方法可以在不扩展每个实例的SimpleSeekBar的情况下管理此问题?如果没有,这可能会更优雅,但我可能更喜欢使用Abstract类。@Athromo您现在可以提供
    ChangeHandler
    的任何实现来更新
    TextView
    ,请参阅更新的答案。我在谷歌上搜索“自定义java侦听器”并浏览GoF Observer模式,同时翻回到这里。这个例子将节省我几次尝试。非常感谢。我的抽象类的一个关键特性是能够在onProgressChanged方法中调用可重写的抽象方法。是否有某种方法可以在不扩展每个实例的SimpleSeekBar的情况下管理此问题?如果没有,这可能会更优雅,但我可能更喜欢使用Abstract类。@Athromo您现在可以提供
    ChangeHandler
    的任何实现来更新
    TextView
    ,请参阅更新的答案。我在谷歌上搜索“自定义java侦听器”并浏览GoF Observer模式,同时翻回到这里。这个例子将节省我几次尝试。非常感谢。我最终使用了一个具体版本的包装器,并使用了一个自定义侦听器,如下所述。这使得使用SeekBar和VerticalSeekBar变得无缝,而使用扩展的SeekBar,我必须为每个SeekBar创建子类,并更改XML中的引用。我最终使用了一个具体版本的包装器和一个自定义侦听器,如下所述。这使得SeekBar和VerticalSeekBar的使用更加无缝,而对于扩展SeekBar,我必须为每个SeekBar创建子类并更改XML中的引用。