无法理解在View.setOnClickListner(this)中使用此关键字的情况吗?

时间:2018-07-29 08:21:39

标签: java android interface this anonymous-class

我知道该关键字引用了类的当前实例。但是,当我们在类中实现View.OnClickListener时,然后调用方法textview.setOnClickListener(this)时,setOnClickListener(this)的this(类的实例对象)的参数如何自动调用onClick()方法。视图类中是否有任何代码接受对象并在此代码上调用onClick方法或发生其他事情?

我想知道幕后情况,android如何从此关键字到达onClick()方法?这就是我想问的吗?

3 个答案:

答案 0 :(得分:0)

OnClickListener是类View中的接口。
如果您的活动通过设置以下内容来实现此界面:

public class MainActivity extends AppCompatActivity implements View.OnClickListener

然后您可以为按钮之类的视图设置侦听器:

myButton.setOnClickListener(this);

并重写实现该方法的onClick方法:

@Override
public void onClick(View v) {
// your code here
}

一个简单的解释是:this表示您的视图将使用您活动中覆盖的onClick方法。

答案 1 :(得分:0)

让我们有一个ElectricityBill界面

created() {
    HTTP.get(`user`)
    .then(response => {

    })
    .catch(e => {
      this.errors.push(e)
    })
  }

现在您可以通过两种方式支付电费,方法是去附近的电力局

public interface ElectricityBill{
  public void pay(int amount);
}

或通过在线支付账单

ElectricityBill bill = new ElectricityBill(){
  @Override
  public void pay(int amount){

  }
}
payBill(bill);

在两种情况下,用户都必须支付XXX金额,如果您想听输入事件,则必须通过原始的 View.OnClickListener 对象或实施并传递 public class User implements ElectricityBill{ ..... @Override public void pay(int amount){ } } ..... payBill(this); } 使其生效。

编辑:

当您通过此操作时,您告诉当前类自己处理click事件,并且必须重写onClick()来执行此操作。当您传递对象时,您可以通过创建匿名类并实现onClick()来让原始类处理onClick。但是,当您通过此操作时,当前的课程将获得侦听输入事件的权限。它成为OnClicklistener的类型,并具有监听onClick()的权限

答案 2 :(得分:0)

要在代码中实现View.setOnclickListener,您需要首先实现公共静态接口View.OnClickListener。

喜欢

    public class MyActivity extends Activity implements View.OnClickListener {
}

上面的接口包含公共无效抽象方法“ onClick(View v)”,您可以重写该抽象方法以放置逻辑 单击视图后将调用此方法。

为简单起见,我创建了代码

// Create an anonymous implementation of OnClickListener
private OnClickListener mCorkyListener = new OnClickListener() {
    public void onClick(View v) {
      // do something when the button is clicked
    }
};

protected void onCreate(Bundle savedValues) {
    ...
    // Capture our button from layout
    Button button = (Button)findViewById(R.id.corky);
    // Register the onClick listener with the implementation above
    button.setOnClickListener(mCorkyListener);
    ...
}

此处OnclickListener是具有对象mCorkyListener的接口 同样,您可以使用此关键字代替mCorkyListener “ this”代表当前类的实例。您可以使用“ this”关键字访问当前类的属性和函数。