Só encontro uma vantagem em cada uma delas que, por sua sua vez, representam uma desvantagem em relação à outra.
setOnClickListener().
Vantagem.
Permite a reutilização de código existente.
Se implementar a interface em uma classe em separado ela pode ser reutilizada em outras situações iguais.
Desvantagem.
A implementação, sendo feita numa classe anônima, torna o código mais difícil de ler e de manter. Claro que é discutível e há quem diga o contrário. No meu entender é código que “aparece do nada”, no meio daquele em que estou interessado a ler/analisar.
onClick no XML
Vantagem.
Código mais fácil de ler. O código está num método declarado para esse propósito.
Pode evitar a necessidade de ter um atributo e usar ofindViewById()
Desvantagem.
O código não pode ser reutilizado.
Só funciona quando a view é usada numa Activity.
Para implementações simples e sem necessidade do código ser reutilizado, use o onClick no XML com o respectivo método no java.
Para implementações mais complexas e/ou reutilização do código, crie uma classe à parte e use o setOnClickListener().
Fonte