GSON ile Android Sözlük Uygulaması

Merhaba arkadaşlar, yeni bir yazıyla Kotlin ile Android Programlama yolculuğumuza devam ediyoruz. Bu yazıda GSON kütüphanesini kullanarak Android uygulamasına dahili olarak eklediğimiz JSON dosyasındaki verileri okuyup Android uygulamada göstermeye çalışacağız. Bu kütüphaneyi özellikle sunucu masrafları olmadan Android uygulaması geliştirmek isteyen herkes kullanabilir. Eğer amacınız bir sözlük uygulaması ise kelimeleri JSON olarak düzenleyip projenize ekleyebilirsiniz. Uygulamaya geçmeden önce GSON hakkında bilgi vermek istiyorum.

UYARI: Burada verilen bilgiler Android Wear ve İleri Android Uygulamaları isimli kitabımdan alınmıştır. Daha fazla bilgi için bu kitabı tavsiye ediyorum. Bu kitap içerisinde Retrofit, OkHttp, Google Gson gibi ağ işlemlerinde sizlere yardımcı olacak ağ kütüphaneleri; Picasso, Image Loader ve Fresco gibi ön belleğe alma kütüphaneleri ve veritabanı kütüphaneleri gibi 3.parti kütüphaneler hakkında ayrıntılı bilgi alabilirsiniz. Özetle kitap tam olarak bir kütüphane cennetidir.

Şimdi GSON hakkında ayrıntılı bilgiler verebiliriz. Gson, JSON verilerini Java nesnelerine dönüştürmede kullanılır. Yani bu kütüphane bir JSON Parser olarak çalışmaktadır. Gson açık kaynak kodlu bir projedir ve Google tarafından geliştirildiği için Google Gson olarak da bilinir. Temel amacı JSON verilerini Java nesnelerine dönüştürmek olan bu kütüphane, Java ile yazılmıştır.
Gson ile ağdan bir veri alamayız. Ancak OkHttp ve Volley gibi kütüphaneleri kullanarak alınan JSON verilerini ayrıştırmada kullanabiliriz. Retrofit kütüphanesi de bu kütüphane ile kullanılıyor.

Bu kısa bilgilendirmeden sonra geliştireceğimiz proje için takip edeceğimiz adımları tek tek belirtebiliriz.

  • Yeni bir Android projesi oluşturmak
  • Gson kütüphanesini projeye eklemek.
  • assets klasörü oluşturmak.
  • assets klasörüne JSON uzantılı dosyamızı eklemek.
  • Word isminde bir Data Class oluşturmak.
  • Uygulamanın activity_main.xml arayüz dosyasını hazırlamak. Yani arayüzünü tasarlamak.
  • Uygulamanın MainActivity.kt sınıfı için ihtiyacımız olan kodları yazmak.

Yeni bir proje oluşturmada bilgi sahibi olmak için listeden işaretli linke tıklamanız yeterlidir. Android projemizi oluşturduktan sonra sonraki adıma geçebiliriz.

Gson Kütüphanesini Projeye Eklemek

Gson ile çalışmadan önce yapmamız gereken temel işlemlerden ilki uygulamaya bu kütüphaneyi eklemektir. Bu işlem diğer tüm kütüphanelerde olduğu gibi burada da aynıdır. Yapmanız gereken işlemler şu şekildedir.
Öncelikle uygulamanızın aşağıdaki yoluna sahip olan dosyasını açalım.

build.gradle (Module: app)

İşaretli dosyayı açınız ve aşağıdaki satırı ekleyiniz.

dependencies {
    ...
    implementation 'com.google.code.gson:gson:2.8.6'
}

Bunu yaptıktan sonra uygulamayı Build -> Rebuild ile yeniden oluşturunuz. Bu işlemden sonra Gson Kütüphanesi uygulamaya eklenir.

GSON kütüphanesi ile bu uygulamayı geliştirdiğim zaman 2.8.6 versiyonu yayındaydı. Projenizin güncel kalması için https://github.com/google/gson linkinden güncel versiyon bilgilerine ulaşabilirsiniz.

assets Klasörü Oluşturmak

GSON kütüphanesi ile verileri çekeceğimiz klasör bu olacak. Bu klasöre bu şekilde isim vermemiz gerekiyor. Çünkü Android platformunda bu klasör bu şekilde kullanılır. Ancak bu klasör oluşturulan her projede bulunmaz. Bundan dolayı kendimiz oluşturmalıyız. Proje dosyalarının listelendiği alanda proje görünümünü Project olarak değiştiriniz (varsayılan olarak Androi görünümünde gelir).

main (sağ tıkla) -> New -> Directory

Yukarıda gösterilen yolu takip ediniz.

assets ismini girdikten sonra OK butonuna tıklayarak klasörü oluşturabilirsiniz. Bu işlemden sonra proje görünümünü tekrar Android yapınız ve assets klasörünün olduğundan emin olunuz. Aşağıdaki gibi..

assets Klasörüne JSON Uzantılı Dosyamızı Eklemek

Projede amacımız basit bir sözlük uygulaması yapmaktır. Bundan dolayı sizler için aşağıdaki JSON dosyasını hazırladım.

[
  {
    "id": 1,
    "word": "author",
    "meaning": "yazar"
  },
  {
    "id": 2,
    "word": "decision",
    "meaning": "karar, kararlılık"
  },
  {
    "id": 3,
    "word": "blackboard",
    "meaning": "kara tahta"
  },
  {
    "id": 4,
    "word": "wave",
    "meaning": "el sallamak, dalgalanmak"
  },
  {
    "id": 5,
    "word": "vital",
    "meaning": "önemli, enerji dolu, yaşamsal"
  },
  {
    "id": 6,
    "word": "shoot",
    "meaning": "ateş etmek, gol atmak, fotoğraf çekmek"
  },
  {
    "id": 7,
    "word": "importance",
    "meaning": "önem"
  },
  {
    "id": 8,
    "word": "target",
    "meaning": "hedef, amaç"
  },
  {
    "id": 9,
    "word": "tremendous",
    "meaning": "çok büyük"
  },
  {
    "id": 10,
    "word": "sunbathe",
    "meaning": "güneşlenmek"
  },
  {
    "id": 11,
    "word": "opinion",
    "meaning": "fikir, yargı"
  },
  {
    "id": 12,
    "word": "beach",
    "meaning": "plaj"
  },
  {
    "id": 13,
    "word": "union",
    "meaning": "birlik, sendika"
  },
  {
    "id": 14,
    "word": "solar",
    "meaning": "güneş"
  }
]

Dosyamızın ismi word_list.json olacaktır. Bu dosyaya, kaynak kodlarını yazının sonunda sizinle paylaşacağım github repomdan ulaşabilirsiniz. Dosyanın aşağıdaki gibi assets klasöründe bulunduğundan emin olunuz.

Word İsminde Bir Data Class Oluşturmak

JSON dosyamız hazır ise şimdi bu dosyada bulunan her bir JSON verisini Java nesnelerine dönüştürmemizi sağlayacak bir Data Class oluşturalım. Burası çok önemlidir. Yapacağınız bir hata uygulamanızın yanlış çalışmasına neden olur. Uygulamada kullanacağımız Word sınıfımızın kodları aşağıdaki gibidir.

package com.mas.gsonapp

data class Word(val id:Int,
                val word:String,
                val meaning:String)

Şimdi gelelim dikkat etmeniz gereken konulara. Bu sınıfta kullandığımız değişken isimleri (id, word, meaning), JSON uzantılı dosyadaki değerler ile birebir aynıdır. Eğer buna dikkat etmezseniz uygulamanız hata vereceği gibi bazı verilere erişim de sağlanmayabilir.

Ayrıca veri tiplerinin de aynı olduğundan mutlaka emin olalım.

activity_main.xml

Arayüz için birçok düzenleme yaptım. Özellikle values klasöründe bulunan styles ve colors gibi dosyalarda birçok düzenleme mevcuttur. Hepsini burada paylaşmak mümkün değil. O yüzden sadece uygulama arayüzünü göstermek istiyorum.

Uygulamanın en tepesinde bir adet TextView (toplam kelime sayısını), onun altında arayüzün daha çekici durması için bir ImageButon, sonrasında İngilizce kelime ve anlamı için birer adet Textview ve sayfanın en altında o anki kelimenin sırasını gösteren bir adet TextView kontrolü bulunmaktadır.

MainActivity.kt

Uygulamanın kalbi bu sınıftır. Buraya kadar anlattığımız bütün yapılar bu sınıfı içinde aktif bir şekilde kullanılmaktadır. Tüm kodları burada vermeden önemli olan kısımları sizlere kısaca aktarmak istiyorum. Öncelikle uygulama açıldığı anda JSON dosyasında bulunan verileri alıp ilk kelimeyi ana ekranda göstermek istiyorum. JSON verisini assets klasöründe bulunan word_list.json dosyasından almayı sağlayan metodumuz aşağıdaki gibidir.

fun getJsonData(context: Context, fileName: String): String? {
        val jsonString: String
        try {
            jsonString = context.assets.open(fileName).bufferedReader().use { it.readText() }
        } catch (ioException: IOException) {
            ioException.printStackTrace()
            return null
        }
        return jsonString
    }

Bu metot içinde bulunan aşağıdaki satır ile dosyadan verinin String olarak alınması sağlanır.

 jsonString = context.assets.open(fileName).bufferedReader().use { it.readText() }

Alınan veriler return ile istenen yere gönderilebilir. Veriler alındıktan sonra aşağıdaki kodlar ile uygulama arayüzünde ilk json verisi kullanıcıya gösterilir.

private fun getWords() {
        val jsonFileString = getJsonData(applicationContext, "word_list.json")
        val gson = Gson()
        val jsonData = object : TypeToken<List<Word>>() {}.type
        words = gson.fromJson(jsonFileString, jsonData)
        tvTotal!!.text = "" + words.size
        showWord()
    }

 private fun showWord() {
        word = words.get(i)
        tvWord!!.text = word.word
        tvMeaning!!.text = word.meaning
        tvCurrent!!.text = "" + word.id
    }

Gson() sınıfından oluşturulan bir nesne yardımıyla alınan JSON verisi Parse işlemine tabi tutulur ve veriler Word yapısında oluşturulan words isimli koleksiyona eklenir. Bu koleksiyondaki veriler Word Data Class yapısındadır. Verilere ulaşmak bu aşamadan sonra çok kolay. showWord() isimli metot içinde alınan ilk veri yani ilk kelime kullanıcıya gösterilir. Peki kelimeler arasında nasıl dolaşabiliriz? Bunun için iki adet buton kullanabilirdik ama uygulama daha havalı görünsün diye bu kez uygulamaya dokunmatik özelliği ekledim. Yani parmağınızı ekran üzerinde sağa sola sürükleyerek kelimeler arasında gezinebilirsiniz. Bunun için kullandığım yapı aşağıdaki gibidir.

override fun onTouchEvent(event: MotionEvent?): Boolean {
        when (event!!.action) {
            MotionEvent.ACTION_DOWN -> oldTouchValue = event.getX()
            MotionEvent.ACTION_UP -> {
                currentX = event.getX()
                if (oldTouchValue!! < currentX!!) {
                    i--
                    if (i < 0) i = words.size - 1
                } else {
                    i++
                    if (i >= words.size) i = 0
                }
            }
        }
        showWord()
        return super.onTouchEvent(event)
    }

onTouchEvent() ile uygulama arayüzüne dokunduğunuz zaman uygulamanızın tepki vermesini sağlayabilirsiniz. ACTION_DOWN ile ekrana ilk dokunduğunuz yerin X koordinatı verisi alınır, ACTION_UP ile parmağınızı kaldırdığınız yerin X koordinatı alınır. Eğer ilk X değeri ikinci X değerinden küçükse sonraki kelime, aksi durumda önceki kelime gösterilir. Diyelim sola doğru sürekli hareket ettiniz ve ilk kelimeye döndünüz. Eğer yine sola doğru hareket ederseniz listedeki son kelime size gösterilir. Eğer sürekli olarak sağa doğru sürüklerseniz ve en son kelimeye geldikten sonra aynı harekete devam ederseniz bu kez listedeki ilk kelime size gösterilir.

Uygulamanın ekran çıktısı aşağıdaki gibi olur.

Uygulama ile ilgili bilmeniz gerekenleri sizlere aktarmaya çalıştım. Unutmayın! Burada anlatılanların verimli olması için uygulamayı bilgisayarınıza indirip deneme yanılma yaparak anlamaya çalışmanız size daha faydalı olacaktır. Ayrıca projeyi oluşturup kodlara bakmadan kendi başınıza yeniden yazmak konuyu anlamanızı hızlandıracaktır. Unutmayın köfte kokmadan aşçı olunmaz. Şimdilik bu kadar. Daha sonra görüşmek üzere sağlıcakla kalın!

Uygulama kodlarına erişmek için buraya tıklayınız.