Sei que uma pergunta com palavras semelhantes já foi feita antes, mas isso é diferente. Eu sou muito novo no desenvolvimento de aplicativos Android e tenho três perguntas sobre as diferenças entre o android:onclick=""
atributo XML e o setOnClickListener
método.
Quais sao as diferenças entre os dois? A diferença entre as duas implementações é encontrada em tempo de compilação ou tempo de execução ou ambos?
Quais casos de uso são favoráveis a qual implementação?
Que diferença (s) o uso de fragmentos no Android faz na escolha da implementação?
android
xml
performance
android-fragments
KG6ZVP
fonte
fonte
onclick
pois precisa garantir que todas as classes implementem esse método. Isso pressupõe que você esteja usando o layout mais de uma vez. No entanto, se você tivesse uma interface java para garantir que o método estivesse em todas as classes que o implementaram, não teria que se preocupar.android:onclick
quando é conveniente, mas sei que às vezes causa problemas, e também não consigo me lembrar deles :)Respostas:
Diferença entre OnClickListener e OnClick:
Ambos funcionam da mesma maneira, apenas que um é definido por meio do código java e o outro por meio do código xml.
Implementação do código setOnClickListener:
Button btn = (Button) findViewById(R.id.mybutton); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { myFancyMethod(v); } }); // some more code public void myFancyMethod(View v) { // does something very interesting }
Implementação XML:
<?xml version="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 -->
Atuação:
Ambos têm o mesmo desempenho. O Xml é pré-analisado em código binário durante a compilação. portanto, não há sobrecarga no Xml.
Limitação:
android: onClick é para API de nível 4 em diante, portanto, se sua meta for <1.6, não poderá usá-lo.
fonte
Estou chocado ninguém falou sobre isso, mas tenha cuidado, embora
android:onClick
XML parece ser uma forma conveniente de alça clique, asetOnClickListener
aplicação fazer algo adicional de adicionar oonClickListener
. Na verdade, isso tornavaclickable
verdadeira a propriedade view .Embora possa não ser um problema na maioria das implementações do Android, de acordo com o construtor do telefone, o botão é sempre padrão para clickable = true, mas outros construtores em algum modelo de telefone podem ter um clickable = false padrão em visualizações que não são de botão.
Portanto, configurar o XML não é suficiente, você tem que pensar o tempo todo para adicionar um
android:clickable="true"
não botão, e se você tiver um dispositivo onde o padrão é clickable = true e você se esquecer de colocar esse atributo XML uma vez, você não notará o problema em tempo de execução, mas obterá o feedback do mercado quando estiver nas mãos de seus clientes!Além disso, nunca podemos ter certeza de como o Proguard ofuscará e renomeará os atributos XML e o método de classe, portanto, não é 100% seguro que eles nunca terão um bug um dia.
Então, se você nunca quer ter problemas e nunca pensar sobre isso, é melhor usar
setOnClickListener
bibliotecas como ButterKnife com anotações@OnClick(R.id.button)
fonte
android:onClick
?Simplesmente:
Se você tiver
android:onClick = "someMethod"
em xml , ele procurapublic void someMethod
em sua classe Activity.OnClickListener
é chamado diretamente de sua atividade e está vinculado a algum particularView
. Por exemplosomeButton.setOnClickListener
e no código abaixo é dito o que deve ser feito quandosomeButton
é pressionado.Espero que ajude :)
fonte
Como dito antes: ambos são uma forma de adicionar lógica em resposta a um evento, neste caso um evento de 'clique'.
Eu iria por uma separação entre lógica e apresentação, assim como fazemos no mundo HTML / JavaScript: deixe o XML para apresentação e adicione ouvintes de eventos por meio de código.
fonte
Se você tiver vários botões usando apenas um método, sugiro fazê-lo em java. Mas se você tiver um botão com um método específico, onClick em XML seria melhor.
fonte
É mais conveniente sempre usar o atributo android: onClick, a menos que você tenha um bom motivo para não fazê-lo, por exemplo, se você instanciar o Button em tempo de execução ou precisar declarar o comportamento do clique em uma subclasse Fragment.
fonte
Existem alguns motivos pelos quais você pode querer definir programaticamente um
OnClickListener
. A primeira é se você quiser alterar o comportamento do botão enquanto o aplicativo está em execução. Você pode apontar o botão para outro método ou apenas desabilitar o botão configurando umOnClickListener
que não faz nada.Quando você define um ouvinte usando o
onClick
atributo, a visualização procura um método com esse nome apenas em sua atividade de host. Definir programaticamente umOnClickListener
permite controlar o comportamento de um botão de algum lugar diferente de sua atividade de host. Isso se tornará muito relevante quando usarmosFragments
, que são basicamente mini atividades, permitindo que você crie coleções reutilizáveis de visualizações com seu próprio ciclo de vida, que podem então ser montadas em atividades. Fragments sempre precisam ser usadosOnClickListeners
para controlar seus botões, já que eles não são Activities, e não serão pesquisados por ouvintes definidos em onClick.fonte
Acho que a principal diferença entre eles é:
OnClick: Quando você clica no botão com o dedo.
OnClickListner: pode ser uma escolha mais ampla que pode ser implementada em vários códigos.
Por exemplo, quando você digita url "ymail.com", o yahoo encontra seu nome de usuário e senha no navegador e habilita o botão de estado de clique para abrir seu e-mail. Esta ação deve ser implementada apenas em onClickListener.
Esta é minha ideia!
fonte