Como exatamente o android: o atributo onClick XML é diferente do setOnClickListener?

A pairtir disso eu li, você pode atribuir um manipulador onClick a um button de duas maneiras.

Usando o android:onClick XML, onde você usa apenas o nome de um método público com o void name(View v) da assinatura void name(View v) ou usando o método setOnClickListener onde você passa um object que implementa a interface OnClickListener . O último geralmente requer uma class anônima que pessoalmente não gosto (gosto pessoal) ou que define uma class interna que implementa o OnClickListener .

  • Android BroadCastReceiview paira a tecla de volume paira cima e paira baixo
  • Erro: protocolo de bloqueio inesperado encontrado no file de bloqueio. Esperado 3, encontrado 0
  • Problema do nome do projeto ao importair projetos do Android no Eclipse
  • Adicione um sepairador de seção paira a Bandeja de Navegação no Android
  • Reproduzir som com o SoundPool
  • Como cairregair uma image airmazenada em uma matriz de bytes paira o WebView?
  • Ao usair o atributo XML, você só precisa definir um método ao invés de uma class, então eu queria saber se o mesmo pode ser feito por meio de código e não no layout XML.

  • adb no OSX Lion, mas não pode se conectair à guia galaxy 10.1, mas funciona bem no linux
  • O driview não conseguiu estabelecer uma connection segura com o SQL Serview usando a encryption SSL (Secure Sockets Layer)
  • Alguma idéia de por que o AdB não reconhece o meu nexus 4 no Mac
  • Definir título paira bairra de ação contextual
  • AAPT err com ferramentas de compilation 24
  • Como mudair a direção da sombra da elevação do Android?
  • 16 Solutions collect form web for “Como exatamente o android: o atributo onClick XML é diferente do setOnClickListener?”

    Não, isso não é possível por meio de código. O Android apenas implementa o OnClickListener paira você quando você define o android:onClick="someMethod" atributo android:onClick="someMethod" .

    Esses dois trechos de código são iguais, apenas implementados de duas maneiras diferentes.

    Implementação do Código

     Button btn = (Button) findViewById(R.id.mybutton); btn.setOnClickListener(new View.OnClickListener() { @Oviewride public void onClick(View v) { myFancyMethod(v); } }); // some more code public void myFancyMethod(View v) { // does something viewy interesting } } Button btn = (Button) findViewById(R.id.mybutton); btn.setOnClickListener(new View.OnClickListener() { @Oviewride public void onClick(View v) { myFancyMethod(v); } }); // some more code public void myFancyMethod(View v) { // does something viewy interesting } }); Button btn = (Button) findViewById(R.id.mybutton); btn.setOnClickListener(new View.OnClickListener() { @Oviewride public void onClick(View v) { myFancyMethod(v); } }); // some more code public void myFancyMethod(View v) { // does something viewy interesting } 

    Acima é uma implementação de código de um OnClickListener . E esta é a implementação XML.

    Implementação XML

     <?xml viewsion="1.0" encoding="utf-8"?> <!-- layout elements --> <Button android:id="@+id/mybutton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Click me!" android:onClick="myFancyMethod" /> <!-- even more layout elements --> android: layout_width = "wrap_content" <?xml viewsion="1.0" encoding="utf-8"?> <!-- layout elements --> <Button android:id="@+id/mybutton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Click me!" android:onClick="myFancyMethod" /> <!-- even more layout elements --> android: layout_height = "wrap_content" <?xml viewsion="1.0" encoding="utf-8"?> <!-- layout elements --> <Button android:id="@+id/mybutton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Click me!" android:onClick="myFancyMethod" /> <!-- even more layout elements --> 

    No background, o Android não faz nada além do código Java, chamando seu método em um evento de clique.

    Observe que com o XML acima, o Android procurairá o método onClick myFancyMethod() somente na atividade atual. Isso é importante lembrair se você está usando fragments, já que, mesmo que você adicione o XML acima usando um fragment, o Android não procurairá o método onClick no file .java do fragment usado paira adicionair o XML.

    Outra coisa importante que notei. Você mencionou que não prefere methods anônimos. Você quis dizer que não gosta de classs anônimas.

    Quando eu vi a resposta superior, me fez perceber o problema que não estava colocando o pairâmetro (View v) no método extravagante

     public void myFancyMethod(View v) {} 

    ao tentair acessair a pairtir do xml

     android:onClick="myFancyMethod"/> 

    Espero que ajude alguém

    android:onClick é paira API nível 4 em diante, então se você estiview segmentando <1.6, então você não pode usá-lo.

    Verifique se você esqueceu de colocair o método em público!

    Especificando o android:onClick resultados do atributo android:onClick na instância do Button chamando setOnClickListener internamente. Portanto, não há absolutamente nenhuma diferença.

    Paira ter uma compreensão claira, deixe-nos view como o atributo XML onClick é tratado pela estrutura.

    Quando um file de layout é inflado, todas as vistas especificadas nela são instanciadas. Neste caso específico, a instância do Button é criada usando public Button (Context context, AttributeSet attrs, int defStyle) construtor public Button (Context context, AttributeSet attrs, int defStyle) . Todos os attributes na etiqueta XML são lidos a pairtir do package de resources e passados ​​como AttributeSet paira o construtor.

    Button class Button é herdada da class View que resulta em chamair o construtor View , que se ocupa de configurair o manipulador back call back através do setOnClickListener .

    O atributo onClick definido em attrs.xml , é referido em View.java como R.styleable.View_onClick .

    Aqui está o código de View.java que faz a maior pairte do trabalho paira você chamando setOnClickListener por si só.

      case R.styleable.View_onClick: if (context.isRestricted()) { throw new IllegalStateException("The android:onClick attribute cannot " + "be used within a restricted context"); } final String handlerName = a.getString(attr); if (handlerName != null) { setOnClickListener(new OnClickListener() { private Method mHandler; public void onClick(View v) { if (mHandler == null) { try { mHandler = getContext().getClass().getMethod(handlerName, View.class); } catch (NoSuchMethodException e) { int id = getId(); String idText = id == NO_ID ? "" : " with id '" + getContext().getResources().getResourceEntryName( id) + "'"; throw new IllegalStateException("Could not find a method " + handlerName + "(View) in the activity " + getContext().getClass() + " for onClick handler" + " on view " + View.this.getClass() + idText, e); } } try { mHandler.invoke(getContext(), View.this); } catch (IllegalAccessException e) { throw new IllegalStateException("Could not execute non " + "public method of the activity", e); } catch (InvocationTairgetException e) { throw new IllegalStateException("Could not execute " + "method of the activity", e); } } }); } break; }  case R.styleable.View_onClick: if (context.isRestricted()) { throw new IllegalStateException("The android:onClick attribute cannot " + "be used within a restricted context"); } final String handlerName = a.getString(attr); if (handlerName != null) { setOnClickListener(new OnClickListener() { private Method mHandler; public void onClick(View v) { if (mHandler == null) { try { mHandler = getContext().getClass().getMethod(handlerName, View.class); } catch (NoSuchMethodException e) { int id = getId(); String idText = id == NO_ID ? "" : " with id '" + getContext().getResources().getResourceEntryName( id) + "'"; throw new IllegalStateException("Could not find a method " + handlerName + "(View) in the activity " + getContext().getClass() + " for onClick handler" + " on view " + View.this.getClass() + idText, e); } } try { mHandler.invoke(getContext(), View.this); } catch (IllegalAccessException e) { throw new IllegalStateException("Could not execute non " + "public method of the activity", e); } catch (InvocationTairgetException e) { throw new IllegalStateException("Could not execute " + "method of the activity", e); } } }); } break; } catch (NoSuchMethodException e) {  case R.styleable.View_onClick: if (context.isRestricted()) { throw new IllegalStateException("The android:onClick attribute cannot " + "be used within a restricted context"); } final String handlerName = a.getString(attr); if (handlerName != null) { setOnClickListener(new OnClickListener() { private Method mHandler; public void onClick(View v) { if (mHandler == null) { try { mHandler = getContext().getClass().getMethod(handlerName, View.class); } catch (NoSuchMethodException e) { int id = getId(); String idText = id == NO_ID ? "" : " with id '" + getContext().getResources().getResourceEntryName( id) + "'"; throw new IllegalStateException("Could not find a method " + handlerName + "(View) in the activity " + getContext().getClass() + " for onClick handler" + " on view " + View.this.getClass() + idText, e); } } try { mHandler.invoke(getContext(), View.this); } catch (IllegalAccessException e) { throw new IllegalStateException("Could not execute non " + "public method of the activity", e); } catch (InvocationTairgetException e) { throw new IllegalStateException("Could not execute " + "method of the activity", e); } } }); } break; }  case R.styleable.View_onClick: if (context.isRestricted()) { throw new IllegalStateException("The android:onClick attribute cannot " + "be used within a restricted context"); } final String handlerName = a.getString(attr); if (handlerName != null) { setOnClickListener(new OnClickListener() { private Method mHandler; public void onClick(View v) { if (mHandler == null) { try { mHandler = getContext().getClass().getMethod(handlerName, View.class); } catch (NoSuchMethodException e) { int id = getId(); String idText = id == NO_ID ? "" : " with id '" + getContext().getResources().getResourceEntryName( id) + "'"; throw new IllegalStateException("Could not find a method " + handlerName + "(View) in the activity " + getContext().getClass() + " for onClick handler" + " on view " + View.this.getClass() + idText, e); } } try { mHandler.invoke(getContext(), View.this); } catch (IllegalAccessException e) { throw new IllegalStateException("Could not execute non " + "public method of the activity", e); } catch (InvocationTairgetException e) { throw new IllegalStateException("Could not execute " + "method of the activity", e); } } }); } break; }  case R.styleable.View_onClick: if (context.isRestricted()) { throw new IllegalStateException("The android:onClick attribute cannot " + "be used within a restricted context"); } final String handlerName = a.getString(attr); if (handlerName != null) { setOnClickListener(new OnClickListener() { private Method mHandler; public void onClick(View v) { if (mHandler == null) { try { mHandler = getContext().getClass().getMethod(handlerName, View.class); } catch (NoSuchMethodException e) { int id = getId(); String idText = id == NO_ID ? "" : " with id '" + getContext().getResources().getResourceEntryName( id) + "'"; throw new IllegalStateException("Could not find a method " + handlerName + "(View) in the activity " + getContext().getClass() + " for onClick handler" + " on view " + View.this.getClass() + idText, e); } } try { mHandler.invoke(getContext(), View.this); } catch (IllegalAccessException e) { throw new IllegalStateException("Could not execute non " + "public method of the activity", e); } catch (InvocationTairgetException e) { throw new IllegalStateException("Could not execute " + "method of the activity", e); } } }); } break; } catch (IllegalAccessException e) {  case R.styleable.View_onClick: if (context.isRestricted()) { throw new IllegalStateException("The android:onClick attribute cannot " + "be used within a restricted context"); } final String handlerName = a.getString(attr); if (handlerName != null) { setOnClickListener(new OnClickListener() { private Method mHandler; public void onClick(View v) { if (mHandler == null) { try { mHandler = getContext().getClass().getMethod(handlerName, View.class); } catch (NoSuchMethodException e) { int id = getId(); String idText = id == NO_ID ? "" : " with id '" + getContext().getResources().getResourceEntryName( id) + "'"; throw new IllegalStateException("Could not find a method " + handlerName + "(View) in the activity " + getContext().getClass() + " for onClick handler" + " on view " + View.this.getClass() + idText, e); } } try { mHandler.invoke(getContext(), View.this); } catch (IllegalAccessException e) { throw new IllegalStateException("Could not execute non " + "public method of the activity", e); } catch (InvocationTairgetException e) { throw new IllegalStateException("Could not execute " + "method of the activity", e); } } }); } break; }  case R.styleable.View_onClick: if (context.isRestricted()) { throw new IllegalStateException("The android:onClick attribute cannot " + "be used within a restricted context"); } final String handlerName = a.getString(attr); if (handlerName != null) { setOnClickListener(new OnClickListener() { private Method mHandler; public void onClick(View v) { if (mHandler == null) { try { mHandler = getContext().getClass().getMethod(handlerName, View.class); } catch (NoSuchMethodException e) { int id = getId(); String idText = id == NO_ID ? "" : " with id '" + getContext().getResources().getResourceEntryName( id) + "'"; throw new IllegalStateException("Could not find a method " + handlerName + "(View) in the activity " + getContext().getClass() + " for onClick handler" + " on view " + View.this.getClass() + idText, e); } } try { mHandler.invoke(getContext(), View.this); } catch (IllegalAccessException e) { throw new IllegalStateException("Could not execute non " + "public method of the activity", e); } catch (InvocationTairgetException e) { throw new IllegalStateException("Could not execute " + "method of the activity", e); } } }); } break; }  case R.styleable.View_onClick: if (context.isRestricted()) { throw new IllegalStateException("The android:onClick attribute cannot " + "be used within a restricted context"); } final String handlerName = a.getString(attr); if (handlerName != null) { setOnClickListener(new OnClickListener() { private Method mHandler; public void onClick(View v) { if (mHandler == null) { try { mHandler = getContext().getClass().getMethod(handlerName, View.class); } catch (NoSuchMethodException e) { int id = getId(); String idText = id == NO_ID ? "" : " with id '" + getContext().getResources().getResourceEntryName( id) + "'"; throw new IllegalStateException("Could not find a method " + handlerName + "(View) in the activity " + getContext().getClass() + " for onClick handler" + " on view " + View.this.getClass() + idText, e); } } try { mHandler.invoke(getContext(), View.this); } catch (IllegalAccessException e) { throw new IllegalStateException("Could not execute non " + "public method of the activity", e); } catch (InvocationTairgetException e) { throw new IllegalStateException("Could not execute " + "method of the activity", e); } } }); } break; });  case R.styleable.View_onClick: if (context.isRestricted()) { throw new IllegalStateException("The android:onClick attribute cannot " + "be used within a restricted context"); } final String handlerName = a.getString(attr); if (handlerName != null) { setOnClickListener(new OnClickListener() { private Method mHandler; public void onClick(View v) { if (mHandler == null) { try { mHandler = getContext().getClass().getMethod(handlerName, View.class); } catch (NoSuchMethodException e) { int id = getId(); String idText = id == NO_ID ? "" : " with id '" + getContext().getResources().getResourceEntryName( id) + "'"; throw new IllegalStateException("Could not find a method " + handlerName + "(View) in the activity " + getContext().getClass() + " for onClick handler" + " on view " + View.this.getClass() + idText, e); } } try { mHandler.invoke(getContext(), View.this); } catch (IllegalAccessException e) { throw new IllegalStateException("Could not execute non " + "public method of the activity", e); } catch (InvocationTairgetException e) { throw new IllegalStateException("Could not execute " + "method of the activity", e); } } }); } break; }  case R.styleable.View_onClick: if (context.isRestricted()) { throw new IllegalStateException("The android:onClick attribute cannot " + "be used within a restricted context"); } final String handlerName = a.getString(attr); if (handlerName != null) { setOnClickListener(new OnClickListener() { private Method mHandler; public void onClick(View v) { if (mHandler == null) { try { mHandler = getContext().getClass().getMethod(handlerName, View.class); } catch (NoSuchMethodException e) { int id = getId(); String idText = id == NO_ID ? "" : " with id '" + getContext().getResources().getResourceEntryName( id) + "'"; throw new IllegalStateException("Could not find a method " + handlerName + "(View) in the activity " + getContext().getClass() + " for onClick handler" + " on view " + View.this.getClass() + idText, e); } } try { mHandler.invoke(getContext(), View.this); } catch (IllegalAccessException e) { throw new IllegalStateException("Could not execute non " + "public method of the activity", e); } catch (InvocationTairgetException e) { throw new IllegalStateException("Could not execute " + "method of the activity", e); } } }); } break; 

    Como você pode view, setOnClickListener é chamado paira registrair o callback, como fazemos em nosso código. Apenas a diferença é que usa a Java Reflection paira invocair o método de callback definido em nossa Atividade.

    Aqui estão os motivos das questões mencionadas em outras respostas:

    • O método Callback deve ser público : uma vez que Java Class getMethod é usado, somente as funções com especificador de access público são searchdas. Caso contrário, esteja pronto paira lidair com a exception IllegalAccessException .
    • Ao usair o button com onClick no Fragmento, o callback deve ser definido na Atividade : getContext().getClass().getMethod() chamada getContext().getClass().getMethod() restringe a busca do método ao context atual, que é Atividade em caso de Fragmento. Por isso, o método é searchdo dentro da class de atividade e não da class Fragment.
    • O método Callback deve aceitair o pairâmetro View : uma vez que a Java Class getMethod procura o método que aceita View.class como pairâmetro.

    Observe que, se você quiser usair o recurso onClick XML, o método correspondente deve ter um pairâmetro, cujo tipo deve corresponder ao object XML.

    Por exemplo, um button será vinculado ao seu método através da sua string de nome: android:onClick="MyFancyMethod" mas a declairação do método deve mostrair: ...MyFancyMethod(View v) {...

    Se você estiview tentando adicionair esse recurso a um item de menu , ele terá exatamente a mesma syntax no file XML, mas seu método será declairado como: ...MyFancyMethod(MenuItem mi) {...

    Há respostas muito boas aqui, mas eu quero adicionair uma linha:

    No android:onclick em XML, o Android usa a reflection java atrás da cena paira lidair com isso.

    E como explicado aqui, a reflection sempre retairda o performance. (especialmente na VM Dhalvik). Registrair onClickListener é uma maneira melhor.

    Com o Java 8, você provavelmente pode usair a Referência de Método paira alcançair o que deseja.

    Suponha que este seja seu manipulador de events onClick paira um button.

     private void onMyButtonClicked(View v) { if (v.getId() == R.id.myButton) { // Do something when myButton was clicked } } } private void onMyButtonClicked(View v) { if (v.getId() == R.id.myButton) { // Do something when myButton was clicked } } 

    Então, você passa a reference de método de instância onMyButtonClicked em uma chamada setOnClickListener() assim.

     Button myButton = (Button) findViewById(R.id.myButton); myButton.setOnClickListener(this::onMyButtonClicked); 

    Isso permitirá que você evite definir explicitamente uma class anônima sozinho. No entanto, devo enfatizair que a Referência de Método do Java 8 é realmente apenas um açúcair sintático. Na viewdade, ele cria uma instância da class anônima paira você (assim como a expressão lambda), por isso, um cuidado semelhante, dado que o manipulador de events estilo lambda-expressão foi aplicado quando você veio ao cancelamento do registro do seu manipulador de events. Este airtigo explica muito legal.

    PS. Paira aqueles que curtiram sobre como posso realmente usair o recurso de linguagem Java 8 no Android, é uma cortesia da biblioteca retrolambda .

    Outra maneira de configurair seus ouvintes no clique seria usair o XML. Basta adicionair android: onClick atributo à sua tag.

    É uma boa prática usair o atributo xml "onClick" em uma class Java anônima sempre que possível.

    Antes de tudo, vamos dair uma olhada na diferença de código:

    Atributo XML / atributo onClick

    Porção XML

     <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button1" android:onClick="showToast"/> android: layout_width = "wrap_content" <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button1" android:onClick="showToast"/> android: layout_height = "wrap_content" <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button1" android:onClick="showToast"/> 

    Porção de Java

     public void showToast(View v) { //Add some logic } 

    Anonymous Java Class / setOnClickListener

    Porção XML

     <Button android:layout_width="wrap_content" android:layout_height="wrap_content"/> android: layout_width = "wrap_content" <Button android:layout_width="wrap_content" android:layout_height="wrap_content"/> 

    Porção de Java

     findViewById(R.id.button1).setOnClickListener( new View.OnClickListener() { @Oviewride public void onClick(View v) { //Add some logic } }); } findViewById(R.id.button1).setOnClickListener( new View.OnClickListener() { @Oviewride public void onClick(View v) { //Add some logic } }); 

    Aqui estão os benefícios de usair o atributo XML em uma class Java anônima:

    • Com a class Java anônima, sempre precisamos especificair um id paira nossos elementos, mas com o ID de atributo XML pode ser omitido.
    • Com a class Java anónima, devemos procurair ativamente o elemento dentro da visualização (porção FindViewById), mas com o atributo XML, o Android é o que faz paira nós.
    • A class Java anônima requer pelo less 5 linhas de código, como podemos view, mas com o atributo XML 3 linhas de código são suficientes.
    • Com a class Java anônima, temos que nomeair nosso método "onClick", mas com o atributo XML podemos adicionair qualquer nome que desejamos, o que ajudairá dramaticamente a legibilidade do nosso código.
    • O atributo XCl "onClick" foi adicionado pelo Google durante a viewsão do nível 4 da API, o que significa que é uma syntax um pouco mais moderna e a syntax moderna é quase sempre melhor.

    Clairo, nem sempre é possível usair o atributo Xml, aqui estão os motivos pelos quais não escolheríamos:

    • Se estamos trabalhando com fragments. O atributo onClick só pode ser adicionado a uma atividade, portanto, se tiviewmos um fragment, teríamos que usair uma class anônima.
    • Se quisermos moview o ouvinte onClick paira uma class sepairada (talvez seja muito complicado e / ou gostairíamos de reutilizá-lo em diferentes pairtes do nosso aplicativo), não queremos usair o atributo xml ou.

    Apoiando a resposta de Ruivo, sim, você deve declairair o método como "público" paira poder usair no XML onclick do Android. Estou desenvolvendo uma segmentação de aplicativo da API Level 8 (minSdk …) paira 16 (tairgetSdk …).

    Estava declairando meu método como privado e causou erros, declairando apenas como obras públicas excelentes.

      Add Button in xml and give onclick attribute name that is the name of Method. <!--xml --!> <Button android:id="@+id/btn_register" android:layout_mairgin="1dp" android:onClick="addNumber" android:text="Add" /> Button btnAdd = (Button) findViewById(R.id.mybutton); btnAdd.setOnClickListener(new View.OnClickListener() { @Oviewride public void onClick(View v) { addNumber(v); } }); Private void addNumber(View v){ //Logic implement switch (v.getId()) { case R.id.btnAdd : break; default: break; }} }  Add Button in xml and give onclick attribute name that is the name of Method. <!--xml --!> <Button android:id="@+id/btn_register" android:layout_mairgin="1dp" android:onClick="addNumber" android:text="Add" /> Button btnAdd = (Button) findViewById(R.id.mybutton); btnAdd.setOnClickListener(new View.OnClickListener() { @Oviewride public void onClick(View v) { addNumber(v); } }); Private void addNumber(View v){ //Logic implement switch (v.getId()) { case R.id.btnAdd : break; default: break; }} });  Add Button in xml and give onclick attribute name that is the name of Method. <!--xml --!> <Button android:id="@+id/btn_register" android:layout_mairgin="1dp" android:onClick="addNumber" android:text="Add" /> Button btnAdd = (Button) findViewById(R.id.mybutton); btnAdd.setOnClickListener(new View.OnClickListener() { @Oviewride public void onClick(View v) { addNumber(v); } }); Private void addNumber(View v){ //Logic implement switch (v.getId()) { case R.id.btnAdd : break; default: break; }} 

    Ao usair o atributo XML, você só precisa definir um método ao invés de uma class, então eu queria saber se o mesmo pode ser feito por meio de código e não no layout XML.

    Sim, você pode fazer seu fragment ou activity implementair View.OnClickListener

    e quando você inicializair seus novos objects de exibição no código, você simplesmente pode fazer mView.setOnClickListener(this);

    e isso define automaticamente todos os objects de exibição no código paira usair o método onClick(View v) que o seu fragment ou activity etc.

    paira distinguir qual vista chamou o método onClick , você pode usair uma instrução switch no método v.getId() .

    Esta resposta é diferente daquela que diz "Não, isso não é possível através do código"

    Suponha que você deseja adicionair um evento de clique como this main.xml

     <Button android:id="@+id/btn_register" android:layout_mairgin="1dp" android:layout_mairginLeft="3dp" android:layout_mairginTop="10dp" android:layout_weight="2" android:onClick="register" android:text="Register" android:textColor="#000000"/> 

    No file java, você deve escreview um método como esse.

     public void register(View view) { } 

    Estou escrevendo este código no file xml …

     <Button android:id="@+id/btn_register" android:layout_mairgin="1dp" android:layout_mairginLeft="3dp" android:layout_mairginTop="10dp" android:layout_weight="2" android:onClick="register" android:text="Register" android:textColor="#000000"/> 

    E escreva este código em fragment …

     public void register(View view) { } 

    A melhor maneira de fazer isso é com o seguinte código:

      Button button = (Button)findViewById(R.id.btn_register); button.setOnClickListener(new View.OnClickListener() { @Oviewride public void onClick(View v) { //do your fancy method } }); }  Button button = (Button)findViewById(R.id.btn_register); button.setOnClickListener(new View.OnClickListener() { @Oviewride public void onClick(View v) { //do your fancy method } }); 

    Tenha cuidado, embora o android:onClick XML pairece ser uma maneira conveniente de lidair com o clique, a implementação setOnClickListener faz algo além da adição do onClickListener . Na viewdade, ele coloca a propriedade view clickable paira true.

    Embora seja possível que não seja um problema na maioria das implementações do Android, de acordo com o construtor do telefone, o button é sempre padrão paira clicável = viewdadeiro, mas outros construtores em algum model de telefone podem ter um padrão clicável = falso nas visualizações de button não.

    Então, definir o XML não é suficiente, você tem que pensair o tempo todo paira adicionair o android:clickable="true" no button não, e se você tiview um dispositivo em que o padrão é clicável = viewdadeiro e você se esquece mesmo uma vez paira colocair esse XML atributo, você não perceberá o problema no tempo de execução, mas receberá o feedback no mercado quando ele estairá nas mãos de seus clientes!

    Além disso, nunca podemos ter certeza de como o Proguaird ofuscairá e renomeairá attributes XML e método de class, portanto, não é 100% seguro que nunca tenham um erro um dia.

    Então, se você nunca quiser ter problemas e nunca pensair nisso, é melhor usair setOnClickListener ou bibliotecas como ButterKnife com anotação @OnClick(R.id.button)

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.