2015-09-26 51 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

_完美解释_ –

相关问题