Android - 为什么我不能覆盖SeekBar的onProgressRefresh方法?

时间:2017-07-17 23:30:52

标签: android

我有一个自定义视图QuizBar,它是SeekBar的子类(实际上是android.support.v7.widget.AppCompatSeekBar,但是谁在乎),我想为它创建一个事件监听器。看看SeekBar源代码,我发现它更新了它的事件监听器:

@Override
void onProgressRefresh(float scale, boolean fromUser, int progress) {
    super.onProgressRefresh(scale, fromUser, progress);
    if (mOnSeekBarChangeListener != null) {
        mOnSeekBarChangeListener.onProgressChanged(this, progress, fromUser);
    }
}

当我尝试做同样的事情时,我在超级电话上收到错误:cannot resolve method onProgressRefresh(float, boolean, int)。为什么是这样?如果不允许这样做,我应该如何创建自定义事件监听器?

我的代码:

@Override
void onProgressRefresh(float scale, boolean fromUser, int progress) {
    super.onProgressRefresh(scale, fromUser, progress);
    if (mOnQuizBarChangeListener != null) {
        mOnQuizBarChangeListener.onProgressChanged(this, progress, fromUser);
    }
}

1 个答案:

答案 0 :(得分:4)

  

当我尝试做同样的事情时,我在超级电话上收到错误:   无法解析方法onProgressRefresh(float,boolean,int)。为什么是   此?

注意您发布的方法声明。该方法没有访问修饰符,在Java中,它使可见性"包私有"。因此,只有同一个包中的类才能看到该方法。

  

如果不允许,我该如何创建自定义事件监听器?

你不应该。如果您的课程只是扩展SeekBar并且您对已定义的回调感兴趣,请使用该回调。

QuizBar quizBar = (QuizBar) findViewById(R.id.quiz_bar);
quizBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        // Do what you need
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    @Overrede
    public void onStopTrackingTouch(SeekBar seekBar) {

    }
});
  

理想情况下,我想在子类中添加功能,这样客户端代码每次都不必这样做。

如果我理解你的评论,那么你可以做的是拦截在基类上设置监听器的调用,以自定义视图需要的默认方式处理它,然后委托。

// QuizBar is now itself a seek bar change listener
public class QuizBar extends SeekBar implements SeekBar.OnSeekBarChangeListener {
    @Override
    public void setOnSeekBarChangeListener(OnSeekBarChangeListener l) {
        // Intercept listener setter, save reference to delegate to, then set this as the real listener
        mOnSeekBarChangeListenerDelegate = l;
        super.setOnSeekBarChangeListener(this);
    }

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        // Do what you need
        // Delegate to mOnSeekBarChangeListenerDelegate
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        // Do what you need
        // Delegate to mOnSeekBarChangeListenerDelegate
    }

    @Overrede
    public void onStopTrackingTouch(SeekBar seekBar) {
        // Do what you need
        // Delegate to mOnSeekBarChangeListenerDelegate
    }
}