Kütüphaneler

Android ButterKnife Kütüphanesi Kullanımı

Merhaba. Bu yazımda Android platformunda kullanıma sunulan, bazı kod bloklarını basitleştiren ve okunabilirliği arttıran ButterKnife kütüphanesinden bahsedeceğim.

ButterKnife, Square firmasında Jake Wharton tarafından geliştirilmiş kullanışlı bir kütüphanedir.

ButterKnife ile Xml yani tasarım tarafında oluşturduğumuz bazı elemanları, Java tarafına geçirmemizi ve kullanabilmemizi sağlar. Xml tarafından kastım Button, TextView, ListView, Drawable, Color, Strings vs.

ButterKnife kütüphanesinin kullanımını basit bir örnek üzerinde gösterelim.

İlk olarak build.gradle dosyamızı hazırlayalım. ButterKnife kütüphanesini kullanabilmek için build.gradle dosyasında en tepeye aşağıdaki satır eklenir.

apply plugin: 'com.android.application'

En altta dependencies kısmına ise şu 2 satır kod eklenmelidir. Son hali:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.mehmetkirazli.butterknife"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'

    // butterknife için bu satırlar eklenmelidir
    implementation 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
}

Örnek olarak ekranımıza basit bir buton ekleyelim ve tıklama olayına 1-2 satırlık kod yazalım.

Normalde klasik olarak butonun tıklama eventi için önce butonu findViewById ile bağlıyoruz ve bir Listener kullanarak işlemi yapıyoruz.

Şu anki yapıda, klasik olarak bildiğimiz kod şu şekildedir:

package com.mehmetkirazli.butterknife;

import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    Button btnTest;

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

        btnTest = findViewById(R.id.button);

        btnTest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this, "Butona Basıldı", Toast.LENGTH_SHORT).show();

                // butonun metni ve arka planı değiştirildi
                btnTest.setText("Tıklandı");
                btnTest.setBackgroundColor(Color.RED);
            }
        });
    }
}

Basit olarak bir adet butonumuz var ve tıklandığında mesaj verip, görselle ilgili değişiklikler yaptık.

ButterKnife kullandığımızda ise biraz daha anlaşılabilir ve kısa bir kod yapısı karşımıza çıkıyor. findViewById yerine BindView annotationunu kullanıyoruz. Üzerinde işlem yaptığımız bileşen bir View bileşeni olduğu için BindView yazıyoruz. Drawable dosyası için olsaydı BindDrawable yazacaktık.

Aynı kodu ButterKnife ile yazarsak:

package com.mehmetkirazli.butterknife;

import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.Toast;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class MainActivity extends AppCompatActivity {

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

        // bind işlemi yapıldı
        ButterKnife.bind(this);
    }

    // buton tanımlandı
    @BindView(R.id.button) Button btnTest;

    // click eventi yazıldı
    @OnClick(R.id.button) void tikla() {
        Toast.makeText(this, "Butona Basıldı", Toast.LENGTH_SHORT).show();

        // butonun metni ve arka planı değiştirildi
        btnTest.setText("Tıklandı");
        btnTest.setBackgroundColor(Color.RED);
    }
}

2 YÖNTEMDE DE ORTAK OLAN ÇIKTIMIZ:

Butona tıklamadan önce:

Butona tıklandıktan sonra:

Burada dikkat ettiyseniz şu anki yapıda(findViewById), butonu oluşturma ve tıklama kodlarımızı onCreate() metodu içerisine yazıyoruz. ButterKnife kullandığımızda ise bu kodları onCreate() dışına yazıyoruz.

Aynı şekilde sadece görsel bileşenleri değil de strings.xml, colors.xml gibi dosyalar için tanımlama yaparsak :

@BindDrawable(R.drawable.icon) Drawable icon; // drawable 
@BindString(R.string.age) String yas; // string 
@BindColor(R.color.yellow) int renk; // color

Şeklinde kullanmamız gerekir. Oluşturduğunuz değişken adını da istediğiniz yerde kullanabilirsiniz. Örnek kullanım:

tvBaslik.setTextColor(renk);
imvProfil.setImageDrawable(icon);

Örnekte sadece buton üzerinden gösterdik fakat TextView, EditText gibi bileşenler de tamamen aynı şekilde kullanılır. Bununla ilgili de basit bir örnek verelim.

public class MainActivity extends AppCompatActivity {

    // bileşenler tanımlandı
    @BindView(R.id.btnArttir) Button btnSayiArttir;
    @BindView(R.id.btnAzalt) Button btnSayiAzalt;
    @BindView(R.id.edtSayi) EditText edtSayi;

    @OnClick(R.id.btnArttir)
    void arttir() {
        edtSayi.setText(String.valueOf(Integer.valueOf(edtSayi.getText().toString()) + 1));
    }

    @OnClick(R.id.btnAzalt)
    void azalt() {
        edtSayi.setText(String.valueOf(Integer.valueOf(edtSayi.getText().toString()) - 1));
    }

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

        ButterKnife.bind(this);
    }
}

Örneğimizde 2 adet buton kullanarak, EditText içerisine girilen sayıyı arttırıp azaltma işlemi yaptık. İki butonun da tanımlamalarını ve click eventini ayrı ayrı yaptık.

KAYNAK KOD İNDİR

Nasıl Çalışır ?

ButterKnife, Annotation tabanlıdır ve Annotation’lar da CompileTime (derleme zamanında) dikkate alınıp çalıştırılır. Bunu sağlayan yapı Annotation Processor‘dur. Siz de AbstractProcessor sınıfından türetilen(extends) bir Processor ve bunun Binding’lerini yazarsanız, siz de kendinize özel bir ButterKnife benzeri bir kütüphane oluşturabilirsiniz ve açık kaynak olarak kullanıma sunabilirsiniz 🙂 Hazırlanan bu tarz kütüphanelere ViewInjector kütüphanesi denir.

Projeyi derlediğinizde (henüz çalıştırmadan), Annotation’un bulunduğu satırlar, şuan bildiğimiz ve uyguladığımız Java kodlarına(findViewById) dönüştürülür. Bunu sağlayan yapı, kütüphane içindeki Annotation Prosessor‘dür. Hangi bileşenin hangi koda dönüştürüleceği ise bu kütüphanede tanımlanmıştır.

Mehmet Kirazlı

İstanbul Eyüp'te ikamet ediyorum. Giresun Alucra'lıyım. Bilgisayar Mühendisliği bölümünden 2013 yılında mezun oldum. "Yeni Başlayanlar için Java 8" kitabının yazarıyım. Şu anda özel bir firmada Mobil Yazılım Geliştirme Uzmanı olarak çalışıyorum.

Yorumları Göster

  • Hocam güzel anlatımınız için teşekkürler, ben kullanmaya çalıştığımda şu hatayı alıyorum
    "Could not find method implementation() for arguments [com.jakewharton:butterknife:8.8.1] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler."

    Android studio 4.1 kullanıyorum yardımcı olabilirmisiniz acaba ne denediysem uygulayamadım

Son Gönderiler

Android Firebase Event (not set) Hatası Çözümü

Merhaba. Firebase Events'e istatistik attığınızda not set şeklinde bir değer görüyorsanız olası çözümünü göstereceğim. (daha&helliip;) Daha Fazla Oku

% gün önce

Namaz Vakitleri Uygulaması Yayında

Merhaba. Android cihazlar için hazırladığım Namaz Vakitleri uygulaması ile 200'e yakın ülkede tüm namaz-ezan vakitlerini… Daha Fazla Oku

% gün önce

Kaza Namazı ve Oruç Takip Uygulaması

Selamlar. İnsanlar için faydalı olması amacıyla geliştirdiğim Kaza Namazı ve Oruç Takip Uygulamasını sizlere tanıtmak… Daha Fazla Oku

% gün önce

Android Volley Kullanımı ve JSON Parse İşlemleri

Volley, Android uygulamalarımızda kullandığımız AsyncTask'ın alternatifi olarak ortaya çıkarılan, Google I/O 2013 sunumunda duyurulan bir… Daha Fazla Oku

% gün önce

Admob TikTok Reklamları Engelleme

Merhaba. Bu yazımda artık baş belası olmuş TikTok reklamlarını, Android uygulamalarımızdaki Admob reklamlarından nasıl kaldıracağımızı… Daha Fazla Oku

% gün önce

Google API OVER_QUERY_LIMIT Hatası ve Cloud Hesabı Tanımlama

Merhaba. Play Store' da yüklü olan En Yakın uygulamamda, yakınlardaki mekanları bulma ve rota çizme,… Daha Fazla Oku

% gün önce