我有一个自定义视图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)
当我尝试做同样的事情时,在超级调用上出现错误:无法解析方法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)
| 归档时间: |
|
| 查看次数: |
365 次 |
| 最近记录: |