Proje büyüdükçe kod karmaşıklığı da artar ve kodun okunabilirliği azalır. Daha az satır ve okunabilir bir kod yazmak için ButterKnife kütüphanesini kullanabilirsiniz. Butter Knife bir View Injector kütüphanesidir. Uygulamamızda bulunan bileşenlere annotationlar kullanarak direkt olarak erişebilmeyi sağlar.

Butter Knife

Öncelikle Butter Knife kütüphanesini projemizde kullanabilmemiz için build.gradle dosyası içerisine kütüphaneyi dahil etmek gerekmektedir. Örnek olarak boş bir proje oluşturalım.

android {
  ...
  // Butterknife requires Java 8.
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

dependencies {
  implementation 'com.jakewharton:butterknife:10.1.0'
  annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'
}

Oluşturulan proje içerisine MainActivity adında bir activity ekleyelim. Layout içerisine TextView ve Button ekleyelim. Butona tıklandığında TextView içerisine Hello World yazan basit bir kod parçacığı ekleyelim.

Öncelikle Butter Knife kullanmadan işlemlerimizi nasıl gerçekleştirdiğimize bakalım. Layout içerisindeki bileşenlere Activity üzerinden erişebilmek için findViewById kullanıyoruz. Butona Click Event’ını vermek için ise satır sayımızın ve kod karmaşıklığının arttığını görebilirsiniz.

MainActivity.java

public class MainActivity extends AppCompatActivity {
    private TextView twTest;
    private Button btnTest;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        twTest = (TextView)findViewById(R.id.twTest);
        btnTest = (Button)findViewById(R.id.btnTest);
        btnTest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                twTest.setText("Hello World!");
            }
        });
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TextView
        android:id="@+id/twTest"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="45dp"
        android:layout_marginTop="200dp"
        android:layout_marginEnd="45dp"
        android:layout_marginBottom="64dp"
        android:text="TextView"
        app:layout_constraintBottom_toTopOf="@+id/btnTest"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <Button
        android:id="@+id/btnTest"
        android:layout_width="283dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="165dp"
        android:text="Button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/twTest" />
</android.support.constraint.ConstraintLayout>

Aynı örneği Activity içerisinde Butter Knife kullanarak yapalım. onCreate içerisine ButterKnife.bind(this); satırını eklediğimizde bu sınıf içerisindeki tanımlamaları onCreate içerisinde tanımlamış gibi olmasını sağlıyor. Bileşenlerimizi Activity’de tanımlamak için kullandığımız findViewById yerine @BindView annotation’nını kullanıyoruz. Click Eventi için yazdığımız satırlarca kod yerine @OnClick annotation’nını kullanarak kodumuzu daha yalın hale getirmiş oluruz.

MainActivity.java

public class MainActivity extends AppCompatActivity {
    @BindView(R.id.twTest) TextView twTest;
    @BindView(R.id.btnTest) TextView btnTest;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
    }
    @OnClick(R.id.btnTest) void clickButton(){
        twTest.setText("Hello World!");
    }
}

Butter Knife kütüphanesi sayesinde kod karmaşıklığının ve satır sayısının azaldığı görülmektedir.