2015-09-26 50 views
4

對不起,如果這個問題可能對你來說很愚蠢,但我對Android編程還不熟悉,而且我無法將自己的頭圍繞Java語法。View.OnClickListener,你能解釋一下嗎?

你能解釋一下這行代碼一步一步發生了什麼?

View.OnClickListener ourOnClickListener = new View.OnClickListener() { 
     @Override 
     public void onClick(View v){ 
     ourMessage.setText(「The button got tapped」); 
     } 
    }; 
+1

閱讀關於匿名內部類,你會明白。 –

回答

12

裏面有View類中聲明的接口,它的OnClickListener,它看起來像這樣在View.java來源:

/** 
* Interface definition for a callback to be invoked when a view is clicked. 
*/ 
public interface OnClickListener { 
    /** 
    * Called when a view has been clicked. 
    * 
    * @param v The view that was clicked. 
    */ 
    void onClick(View v); 
} 

通常你會創建一個類,並讓它實現這個接口:

public void MyClass implements View.OnClickListener { 

    @Override 
    public void onClick(View view) { 
    // do stuff 
    } 
} 

但有時你不需要這個類在一個單獨的文件。相反,你可以創建匿名內部類,它就像創建新類,其中只有方法是從界面中指定的一個:

new View.OnClickListener() { 
     @Override 
     public void onClick(View v){ 
      ourMessage.setText(「The button got tapped」); 
     } 
} 

然後,您可以使用這個類處處需要View.OnClickListener接口的實例。

還值得一提的是,匿名內部類將持有對您創建它的類的引用。因此,這將是合法有效:

public class MyClass { 

    private int clicksCount = 0; 

    private View.OnClickListener listener = new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     clicksCount += 1; 
    } 
    } 
} 

在這裏,您可以訪問clicksCount場,這是MyClass領域甚至實現OnClickListener內部類。注意 - 如果你想訪問一個變量,你需要添加final修飾符:

public void testMethod(final int canAccess, int cantAccess) { 
    final String test = otherView.getText().toString(); 
    myView.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     // Cannot access cantAccess, because it's not final 
     if (test.length == 0) { // can access 
     // do something 
     } 
    } 
} 
+1

_完美解釋_ –

相關問題