2016-12-24 69 views
0

onClick方法在用戶點擊視圖時被觸發,OnclickListener是一個界面是否正確?它沒有定義一個方法的工作方式。忽視界面如何工作

據我所知,當onClick方法被調用時,它給程序員自由定義它自己的動作,但當用戶單擊視圖時該方法是如何調用的?和它是如何工作的當有多種方法在接口

據我所知,它的基本java問題比android問題更多。但我真的有這個疑問了很長一段時間。希望以某種方式解釋我是如何工作的。

 public interface OnClickListener 
    {   
    /**   
     * Called when a view has been clicked.   
     *   
     * @param v The view that was clicked. 
     */   
    void onClick(View v); 
    } 
+0

您可能需要澄清你問;至少我不覺得它很清楚。你在問這些元素是如何叫做處理程序的? – Carcigenicate

回答

0

我在開始學習android時遇到了同樣的問題,按下按鈕時它不直接調用onClick方法。每一件事都是由android完成的。當我們第一次調用setOnclickListener時,它將設置信息偵聽器。這裏有setOnClickListener方法的源代碼。

public void setOnClickListener(OnClickListener l) 
{ 
    if (!isClickable()) 
    { 

     setClickable(true); 
    } 
    getListenerInfo().mOnClickListener = l; 
} 

我們有一個performAccessibilityActionInternal當我們按下屏幕,如果動作是點擊它會調用performClick方法,這perfromClick方法將調用監聽 這裏的onclick方法這就是所謂的方法是performClick方法

public boolean performClick() { 
    final boolean result; 
    final ListenerInfo li = mListenerInfo; 
    if (li != null && li.mOnClickListener != null) { 
     playSoundEffect(SoundEffectConstants.CLICK); 
     li.mOnClickListener.onClick(this); 
     result = true; 
    } else { 
     result = false; 
    } 

    sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED); 
    return result; 
    } 

對於詳見Android開源代碼here

0

這是一個回調機制。你需要定義一個實現OnclickListener接口的具體類。也就是說,當你setOnClickListener在這樣

Button button = (Button) findViewById(R.id.button_id); 
      button.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View v) { 
        // Perform action on click 
       } 
      }); 

認爲你是定義一個實現OnClickInterface匿名內部類你做什麼。 您也可以定義另一個實現OnClickInterface的Custom類,並在setOnClickListener中設置該類。

當您設置監聽,瞭解要能夠可視化按鈕將其內部都有你的類的引用

如:

public class Button extends TextView { 
    OnClickInterface mCallBack; 

    void setOnClickListener (OnClickInterface in) { 
     mCallBack = in; 
    } 
    void clicked(){ 
     in.onClick(this); 
    } 
} 

只要點擊按鈕,它只是調用的onclick你的接口實現的方法給它的觀點

希望它有助於

0

在Java中的接口是一個合同,它包含這是希望支持合同的類必須實現的方法的簽名。

public interface OnClickListener 
{    
     void onClick(View v); 
} 

實現OnClickListener甲類有實現該方法onClick(View v)。例如 -

public class LogListener implements OnClickListener 
{    
    private final Logger logger; 

    LogListener(Logger logger) { this.logger = logger; } 

    void onClick(View v) { logger.log("View Clicked!"); } 
} 

一個接口不能被構建,它只能引用接口的實現的一個實例 -

OnClickListener listener = new LogListener(logger); 

listener.onClick被調用時,被引用的對象的執行是在取運行時間 - 在這種情況下爲LogListener.onClick

Android框架希望支持一種方式,即視圖會提醒他們已被點擊,以便程序員能夠處理點擊,因此他們提供了一種方法setOnClickListener,該方法獲取實現OnClickListener的任何對象都保留對其的引用,當點擊按鈕時,會調用onClick方法。

這種模式被稱爲Observer Pattern

相關問題