我有一个自定义视图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);
}
}
答案 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
}
}