Reputation: 846
I have a custom view QuizBar
which is a subclass of SeekBar
(actually android.support.v7.widget.AppCompatSeekBar
but who cares) and I would like to make an event listener for it. Looking at the SeekBar source, I see that it updates its event listener like so:
@Override
void onProgressRefresh(float scale, boolean fromUser, int progress) {
super.onProgressRefresh(scale, fromUser, progress);
if (mOnSeekBarChangeListener != null) {
mOnSeekBarChangeListener.onProgressChanged(this, progress, fromUser);
}
}
When I try to do the same thing, I get an error on the super call: cannot resolve method onProgressRefresh(float, boolean, int)
. Why is this? If this isn't allowed, how should I create a custom Event Listener?
My Code:
@Override
void onProgressRefresh(float scale, boolean fromUser, int progress) {
super.onProgressRefresh(scale, fromUser, progress);
if (mOnQuizBarChangeListener != null) {
mOnQuizBarChangeListener.onProgressChanged(this, progress, fromUser);
}
}
Upvotes: 1
Views: 736
Reputation: 10155
When I try to do the same thing, I get an error on the super call: cannot resolve method onProgressRefresh(float, boolean, int). Why is this?
Notice the method declaration you posted. There is no access modifier on the method, which, in Java, makes the visibility "package private". Thus, only classes in the same package can see that method.
If this isn't allowed, how should I create a custom Event Listener?
You shouldn't. If your class just extends SeekBar
and you're interested in a callback that is already defined, just use that one.
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) {
}
});
Ideally I would like to add functionality inside the subclass, so that the client code doesn't have to do it each time.
If I understand your comment correctly, then what you can do is intercept the call to setting the listener on the base class, handle it in some default fashion as your custom view requires, then delegate.
// 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
}
}
Upvotes: 5