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

pjc*_*pjc 1 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试做同样的事情时,在超级调用上出现错误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);
    }
}
Run Code Online (Sandbox Code Playgroud)

dom*_*der 5

当我尝试做同样的事情时,在超级调用上出现错误:无法解析方法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) {

    }
});
Run Code Online (Sandbox Code Playgroud)

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

如果我正确理解了您的评论,那么您可以做的是截取对在基类上设置侦听器的调用,根据您的自定义视图的要求以某种默认方式处理它,然后委派。

// 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
    }
}
Run Code Online (Sandbox Code Playgroud)