2017-07-17 166 views
0

我有一个自定义视图QuizBar这是SeekBar(实际上android.support.v7.widget.AppCompatSeekBar,但谁在乎)的子类,我想为它做一个事件监听器。综观搜索栏源,我看到它更新其事件侦听器,像这样:Android - 为什么我不能重写SeekBar的onProgressRefresh方法?

@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

当我试图做同样的事情,我得到一个错误的超级电话: 无法解析方法onProgressRefresh(浮点,布尔,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 
    } 
} 
+0

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

+0

查看我的更新。如果这仍然不能回答你的问题,请提供更多细节。 – dominicoder

相关问题