2017-07-17 69 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

相關問題