【问题标题】:Can't understand use of this keyword in View.setOnClickListner(this)?无法理解在 View.setOnClickListner(this) 中使用 this 关键字?
【发布时间】:2019-01-05 19:01:36
【问题描述】:

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

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

【问题讨论】:

    标签: java android interface this anonymous-class


    【解决方案1】:

    OnClickListener 是类View 中的一个接口。
    如果你的activity通过设置实现了这个接口:

    public class MainActivity extends AppCompatActivity implements View.OnClickListener
    

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

    myButton.setOnClickListener(this);
    

    并像这样覆盖实现它的 onClick 方法:

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

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

    【讨论】:

    • 但是我想知道幕后发生了什么,android是如何从这个关键字到达onClick()方法的?这就是我想问的?
    • 这个关键字指向被覆盖的onClick。您必须更深入地了解 Java 类和接口。如果你搜索的话,有很多教程可以学习。
    • 在我读过的任何地方,他们都说关键字 this 指的是当前类的实例。你能把它引给我任何解释得当的文章吗?
    • 没错,关键字this表示这个活动将处理onClick方法
    【解决方案2】:

    要在您的代码中实现 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’ 关键字访问当前类的属性和函数。

    【讨论】:

      【解决方案3】:

      让我们有一个接口 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() 的权限

      【讨论】:

      • 问题是这个关键字如何指向被覆盖的 onClick 方法()?因为在每篇文章中他们都说这个关键字指的是当前类的实例。
      • 什么是payBill?
      • payBill() 采用 ElectricityBill 的实例,您可以通过创建对象或传递 this 来传递该实例。 @Novice 当你通过这个时,你告诉当前类自己处理点击事件,并且必须覆盖 onClick() 这样做。当你传递对象时,你让原始类通过创建一个匿名类并实现 onClick() 来处理 onClick。但是当你通过这个时,你当前的类获得了监听输入事件的权限。它变成了 OnClicklistener 的类型,并获得了监听 onClick() 的权限。
      猜你喜欢
      • 2014-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      相关资源
      最近更新 更多