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

Can't understand use of this keyword in View.setOnClickListner(this)?

提问人:Novice 提问时间:7/29/2018 最后编辑:PhantômaxxNovice 更新时间:7/29/2018 访问量:94

问:

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

我想知道幕后发生了什么,android 是如何从这个关键字到达 onClick() 方法的?这就是我想问的?

Java Android 接口 这个 匿名类

评论


答:

0赞 user8959091 7/29/2018 #1

OnClickListener是类中的接口。
如果您的 Activity 通过设置以下方式实现此接口:
View

public class MainActivity extends AppCompatActivity implements View.OnClickListener

然后,您可以为视图 Like 按钮设置侦听器:

myButton.setOnClickListener(this);

并覆盖实现它的 onClick 方法,如下所示:

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

因此,一个简单的解释是:意味着您的视图将使用活动的重写方法。thisonClick

评论

0赞 Novice 7/29/2018
但是我想知道幕后发生了什么,android 是如何从这个关键字到达 onClick() 方法的?这就是我想问的?
0赞 7/29/2018
此关键字指向被覆盖的 onClick。您必须更深入地了解 Java 类和接口。如果您搜索,有许多教程可以遵循。
0赞 Novice 7/29/2018
在我读到的任何地方,他们都说关键字这是指类的当前实例。你能给我推荐任何有正确解释的文章吗?
0赞 7/29/2018
确切地说,关键字意味着此活动将处理该方法thisonClick
0赞 vikas kumar 7/29/2018 #2

让我们有一个界面 ElectricityBill

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

现在有两种方法可以去附近的电力局办公室支付电费

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

  }
}
payBill(bill);

或通过在线支付账单

    public class User implements ElectricityBill{
     .....
          @Override
          public void pay(int amount){

          }
        }
     .....
  payBill(this);

    }

在这两种情况下,用户都必须支付 XXX 金额,类似情况,如果您想监听输入事件,您必须传递原始 View.OnClickListener 对象或实现它并传递以使其工作。this

编辑:

当你传递它时,你告诉当前类处理点击事件本身,并且必须覆盖 onClick() 才能这样做。当你传递对象时,你让原始类通过创建一个匿名类并实现 onClick() 来处理 onClick。但是当你传递它时,你当前的类将获得侦听输入事件的权限。它变为 OnClicklistener 的类型,并获得侦听 onClick() 的权限

评论

0赞 Novice 7/29/2018
问题是这个关键字如何指向被覆盖的 onClick method() ?因为在每篇文章中,他们都说这个关键字指的是类的当前实例。
0赞 7/29/2018
什么是payBill?
0赞 vikas kumar 7/29/2018
payBill() 接受 ElectricityBill 的一个实例,您可以通过创建对象或传递它来传递它。@Novice,当你传递它时,你告诉当前类处理点击事件本身,并且必须覆盖 onClick() 才能这样做。当你传递对象时,你让原始类通过创建一个匿名类并实现 onClick() 来处理 onClick。但是当你传递它时,你当前的类将获得侦听输入事件的权限。它变为 OnClicklistener 的类型,并获得了侦听 onClick() 的权限。
0赞 Parikshit Sharma 7/29/2018 #3

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

喜欢这个

    public class MyActivity extends Activity implements View.OnClickListener {
}

上面的接口包含公共 void 抽象方法“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”关键字访问当前类的属性和函数。