首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >安卓- setOnClickListener vs OnClickListener vs View.OnClickListener

安卓- setOnClickListener vs OnClickListener vs View.OnClickListener
EN

Stack Overflow用户
提问于 2015-04-07 05:03:36
回答 5查看 227.6K关注 0票数 40

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

  1. 创建按钮对象
  2. 使用OnClickListner使其在用户单击按钮后侦听用户的click
  3. 使用onClick执行操作

<>G29

现在,

  • setOnClickListener在上述逻辑中的位置是什么?
  • 实际监听按钮单击的是哪一个?
  • 这三者之间有什么区别?

这是我在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的一部分来实现会更方便。这将避免额外的类加载和对象分配。例如:

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
    }
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-04-07 05:19:49

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

  1. 创建按钮
  2. 创建OnClickListener*的实例,然后使用片段/活动onCreate-method.
  3. When中的onClick覆盖该OnClickListener将该OnClickListener分配给该按钮。用户单击该按钮时,将调用分配的OnClickListeneronClick函数。<代码>H216<代码>G217

*如果您使用import android.view.View;,则使用View.OnClickListener。如果你使用import android.view.View.*;import android.view.View.OnClickListener;,据我所知,你使用的是OnClickListener

另一种方式是让你的活动/片段继承自OnClickListener。这样,您可以将您的片段/活动指定为按钮的侦听器,并将onClick实现为成员函数。

票数 26
EN

Stack Overflow用户

发布于 2015-04-07 05:23:18

假设我们有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;
        }
    }
}

最后,这里没有真正的区别,只是“比其他的”要好得多

票数 67
EN

Stack Overflow用户

发布于 2017-03-13 11:17:34

请注意,为了简单起见,我只参考了第一个代码片段,即,

// 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)是View类的一个公共方法。Button类扩展了View类,因此可以调用setOnClickListener(View.OnClickListener l)方法。

setOnClickListener注册了一个回调,当单击视图(在本例中为按钮)时将调用它。这个答案应该能回答你的前两个问题:

1. setOnClickListener 在上述逻辑中的位置是什么?

Ans。当按钮被点击时,它注册一个回调。(在下一段中详细解释)。

2.到底是哪一个人在监听按钮点击?

Ans。setOnClickListener方法是实际侦听按钮单击的方法。

当我说它注册了一个要调用的回调时,我的意思是它将运行View.OnClickListener l,这是该方法的输入参数。在您的示例中,它将是button.setOnClickListener(mCorkyListener);中提到的mCorkyListener,然后它将执行

// 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

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29479647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档