Android - setOnClickListener 对比 OnClickListener 对比 View.OnClickListener

Android - setOnClickListener vs OnClickListener vs View.OnClickListener

我的理解是,当我创建一个监听点击的按钮对象时,我必须:

  1. 创建按钮对象
  2. 使用OnClickListner让它监听用户的点击
  3. 使用onClick在用户点击按钮后执行动作

现在,

这是我在 Android Dev:

中找到的内容
//The example below shows how to register an on-click listener for a Button.

// 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 作为 Activity 的一部分来实施会更方便。这将避免额外的 class 负载和对象分配。例如:

public class ExampleActivity extends Activity implements OnClickListener {
    protected void onCreate(Bundle savedValues) {
        ...
         Button button = (Button)findViewById(R.id.corky);
         button.setOnClickListener(this);
    }

    // Implement the OnClickListener callback
    public void onClick(View v) {
      // do something when the button is clicked
    }
}

逻辑很简单。 setOnClickListener 属于第 2 步。

  1. 您创建按钮
  2. 您创建了一个 OnClickListener* 的实例,就像在该示例中所做的那样,并覆盖了 onClick 方法。
  3. 您在 fragments/activities onCreate 方法中使用 btn.setOnClickListener(myOnClickListener);OnClickListener 分配给该按钮。
  4. 当用户点击按钮时,调用分配的 OnClickListeneronClick 函数。

*如果你 import android.view.View; 你使用 View.OnClickListener。如果你 import android.view.View.*;import android.view.View.OnClickListener; 你使用 OnClickListener 据我所知。

另一种方法是让你activity/fragment继承自OnClickListener。通过这种方式,您可以将 fragment/activity 指定为按钮的侦听器,并将 onClick 实现为成员函数。

  1. 首先,View.OnClickListenerOnClickListener没有区别。如果直接用View.OnClickListener就不用写-

    导入android.view.View.OnClickListener

  2. 您通过 setOnclickListener() 将一个 OnClickListener 实例(例如 myListener 命名对象)设置为视图的侦听器。当触发 click 事件时,会通知 myListener 并调用它的 onClick(View view) 方法。那是我们完成自己任务的地方。 希望对你有帮助。

假设我们有 3 个按钮

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        // Capture our button from layout
        Button button = (Button)findViewById(R.id.corky);
        Button button2 = (Button)findViewById(R.id.corky2);
        Button button3 = (Button)findViewById(R.id.corky3);
        // Register the onClick listener with the implementation above
        button.setOnClickListener(mCorkyListener);
        button2.setOnClickListener(mCorkyListener);
        button3.setOnClickListener(mCorkyListener);

    }

    // Create an anonymous implementation of OnClickListener
    private View.OnClickListener mCorkyListener = new View.OnClickListener() {
        public void onClick(View v) {
            // do something when the button is clicked 
            // Yes we will handle click here but which button clicked??? We don't know

        }
    };

}

那我们怎么办?

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        // Capture our button from layout
        Button button = (Button)findViewById(R.id.corky);
        Button button2 = (Button)findViewById(R.id.corky2);
        Button button3 = (Button)findViewById(R.id.corky3);
        // Register the onClick listener with the implementation above
        button.setOnClickListener(mCorkyListener);
        button2.setOnClickListener(mCorkyListener);
        button3.setOnClickListener(mCorkyListener);

    }

    // Create an anonymous implementation of OnClickListener
    private View.OnClickListener mCorkyListener = new View.OnClickListener() {
        public void onClick(View v) {
            // do something when the button is clicked
            // Yes we will handle click here but which button clicked??? We don't know

            // So we will make
            switch (v.getId() /*to get clicked view id**/) {
                case R.id.corky:

                    // do something when the corky is clicked

                    break;
                case R.id.corky2:

                    // do something when the corky2 is clicked

                    break;
                case R.id.corky3:

                    // do something when the corky3 is clicked

                    break;
                default:
                    break;
            }
        }
    };

}

或者我们可以这样做:

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        // Capture our button from layout
        Button button = (Button)findViewById(R.id.corky);
        Button button2 = (Button)findViewById(R.id.corky2);
        Button button3 = (Button)findViewById(R.id.corky3);
        // Register the onClick listener with the implementation above
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // do something when the corky is clicked
            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // do something when the corky2 is clicked
            }
        });
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // do something when the corky3 is clicked
            }
        });

    }

}

或者我们可以实施 View.OnClickListener,我认为这是最好的方法:

public class MainActivity extends ActionBarActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        // Capture our button from layout
        Button button = (Button)findViewById(R.id.corky);
        Button button2 = (Button)findViewById(R.id.corky2);
        Button button3 = (Button)findViewById(R.id.corky3);
        // Register the onClick listener with the implementation above
        button.setOnClickListener(this);
        button2.setOnClickListener(this);
        button3.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        // do something when the button is clicked
        // Yes we will handle click here but which button clicked??? We don't know

        // So we will make
        switch (v.getId() /*to get clicked view id**/) {
            case R.id.corky:

                // do something when the corky is clicked

                break;
            case R.id.corky2:

                // do something when the corky2 is clicked

                break;
            case R.id.corky3:

                // do something when the corky3 is clicked

                break;
            default:
                break;
        }
    }
}

终于在这里没有真正的区别只是"Way better than the other"

View 是所有小部件的超级class,OnClickListener 接口属于这个class。所有小部件都继承了这一点。 View.OnClickListener 与 OnClickListener 相同。您必须覆盖此侦听器的 onClick(View view) 方法才能实现您希望按钮执行的操作。

要告诉 Android 监听小部件的点击事件,您需要执行以下操作:

widget.setOnClickListener(this); // If the containing class implements the interface
// Or you can do the following to set it for each widget individually
widget.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // Do something here
    }
});

onClick() 方法中传递的 'View' 参数只是让 Android 知道视图已被单击。它可以是 Button 或 TextView 或其他东西。由您为每个小部件设置一个 OnClickListener 或简单地使包含所有这些小部件的 class 实现接口。在这种情况下,您将为所有小部件使用一个通用的 onClick() 方法,您所要做的就是检查传递给该方法的视图的 ID,然后将其与您想要的每个元素的 ID 进行匹配,对该元素采取行动。

请注意,为了简单起见,我仅引用了第一个代码片段,即

// 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);
    ...
}

setOnClickListener(View.OnClickListener l) 是视图 class 的一个 public 方法。按钮 class 扩展视图 class,因此可以调用 setOnClickListener(View.OnClickListener l) 方法。

setOnClickListener 注册一个回调,当点击视图(在你的例子中是按钮)时调用。这个答案应该回答你的前两个问题:

1. setOnClickListener符合上述逻辑的什么地方?

回答。单击按钮时它会注册一个回调。 (在下一段详细解释)。

2。哪个真正听到按钮点击?

回答。 setOnClickListener 方法是实际监听按钮点击的方法。

当我说它注册一个回调函数时,我的意思是它将 运行 View.OnClickListener l 作为该方法的输入参数。在您的情况下,它将是 button.setOnClickListener(mCorkyListener); 中提到的 mCorkyListener,然后将执行

中提到的方法 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
    }
};

继续前进,OnClickListener 是一个接口定义,用于在单击视图(在您的情况下为按钮)时调用的回调。简单地说,当您单击该按钮时,mCorkyListener 中的方法(因为它是 OnClickListener 的实现)将被执行。但是,OnClickListener 只有一种方法,即 OnClick(View v)。因此,单击按钮时需要执行的任何操作都必须在此方法中进行编码。

现在您知道了 setOnClickListenerOnClickListener 的含义,我相信您自己能够区分这两者。第三项 View.OnClickListener 实际上是 OnClickListener 本身。前面有 View. 的唯一原因是程序开头的 import 语句不同。如果只有 import android.view.View; 作为导入语句,则必须使用 View.OnClickListener。如果您提到这些导入语句中的任何一个: import android.view.View.*;import android.view.View.OnClickListener; 你可以跳过 View. 并简单地使用 OnClickListener.