Maneira mais prática de desenvolver código repetitivo

Pessoal, boa noite.

Gostaria de abrir um espaço e pedir uma grande ajuda para um código em Android que será imensamente repetitivo. Este código abaixo deverá ter 3 botões que farão a mesma ação (utilizarei métodos que irão diferir apenas no parâmetro passado ao serem chamados) e um textview (no caso linha1 e linha2) que irá ter um nome diferente a cada linha. No código eu postei apenas duas linhas, mas eu vou utilizar 32 linhas de código.
Minha dúvida é, a solução é apenas copiar e colar e retrabalhar tudo o que eu preciso? Existe alguma forma mais prática e simples de montar o código, mesmo porque ele irá sofrer adições ou remoções no tempo e posso não ser eu que vou fazer essa manutenção?
Se alguém tiver alguma experiência ou conhecer como eu simplifico isto eu fico imensamente grato! Criei esse aplicativo de aprendizado exatamente por não entender como é feito um código extenso, se é realmente repetitivo ou existem técnicas para simplificar isto.

Código:
activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Linha1" />

        <Button
            android:id="@+id/buttonX"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="X" />

        <Button
            android:id="@+id/buttonY"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Y" />

        <Button
            android:id="@+id/buttonZ"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Z" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Linha2" />

        <Button
            android:id="@+id/buttonX2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="X" />

        <Button
            android:id="@+id/buttonY2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Y" />

        <Button
            android:id="@+id/buttonZ2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Z" />

    </LinearLayout>

    <TextView
        android:id="@+id/textViewRes"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Botão Apertado:"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>

MainActivity.java

package com.example.testebotoes;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		final Button buttonX = (Button)findViewById(R.id.buttonX);
		final Button buttonY = (Button)findViewById(R.id.buttonY);
		final Button buttonZ = (Button)findViewById(R.id.buttonZ);
		
		final Button buttonX2 = (Button)findViewById(R.id.buttonX2);
		final Button buttonY2 = (Button)findViewById(R.id.buttonY2);
		final Button buttonZ2 = (Button)findViewById(R.id.buttonZ2);
		
		final TextView textViewRes = (TextView)findViewById(R.id.textViewRes);
		
		buttonX.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				textViewRes.setText("Botão Apertado: Botão X");
			}
		});
		
		buttonY.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				textViewRes.setText("Botão Apertado: Botão Y");
			}
		});
		
		buttonZ.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				textViewRes.setText("Botão Apertado: Botão Z");
			}
		});
		
		buttonX2.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				textViewRes.setText("Botão Apertado: Botão X");
			}
		});
		
		buttonY2.setOnClickListener(new OnClickListener() {
		
		@Override
		public void onClick(View arg0) {
		textViewRes.setText("Botão Apertado: Botão Y");
		}
		});
		
		buttonZ2.setOnClickListener(new OnClickListener() {
		
		@Override
		public void onClick(View arg0) {
		textViewRes.setText("Botão Apertado: Botão Z");
		}
		});
		

		
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

Muito obrigado e qualquer dúvida se não estiver claro tentarei explicar da melhor maneira possível.

Uai, num da pra agrupar as instruções semelhantes em uma função?

Tipo :


buttonX.setOnClickListener(new OnClickListener() {  
              
            @Override  
            public void onClick(View arg0) {  
                 cliqueiNoBotao ("X");
            }  
        });  



 public void cliqueiNoBotao (String botaoApertado) {  
         textViewRes.setText("Botão Apertado: Botão "+ botaoApertado);
    }  

Acho que é mais agradável de se programar… =)

Apenas colocar o corpo da tarefa em uma função ainda vai deixar com um montão de declarações de listener repetidos. Já que são todos iguais é melhor criar uma classe Listener e reaproveita-la.

Mais ou menos assim: (código de olho, não fique nervoso se tiver erro de compilação :slight_smile: )

class BotaoApertadoListener implements OnClickListener {
   private String descricaoBotao;

   BotaoApertadoListener (String botao) {
        this.descricaoBotao = botao;
   }

   @Override  
   public void onClick(View arg0) {  
      textViewRes.setText("Botão Apertado: Botão " + descricaoBotao);  
   }
}

// No onCreate as linhas de 28 a 74 viram isso:
buttonX.setOnClickListener(new BotaoApertadoListener("X"));
buttonY.setOnClickListener(new BotaoApertadoListener("Y"));
buttonZ.setOnClickListener(new BotaoApertadoListener("Z"));
buttonX2.setOnClickListener(new BotaoApertadoListener("X2"));
buttonY2.setOnClickListener(new BotaoApertadoListener("Y2"));
buttonZ2.setOnClickListener(new BotaoApertadoListener("Z2"));