Android Yakıt Hesabı Uygulaması

Yakıt Hesabı uygulaması blogun ilk android uygulamasıdır. Giriş seviyesinde basit bir uygulamadır. Uygulama, ekran (layout) tasarımı, ekrandaki elemanların tanıtılması ve olaylarının kullanılması, ayarların saklanması, okunması, silinmesi gibi temel konulara örnektir.

Uygulama ile varış-kalkış km, ortalama tüketim ve yakıt fiyatı girilerek yapılan km, km’de yakılan ve toplam harcama hesaplanmaktadır.

Uygulama Android Studio ile yapılmıştır. Android Studio ile android uygulamaları yapmak çok kolaydır. Android Studio’da android uygulamaları yapmak için Java dili kullanılmaktadır. Bu sebeple Java ve Java JDK, Android Studio kurulmadan indirilip kurulmalıdır. Java JDK’ya Oracle şirketinin Java.com geliştiriciler kısmında ulaşılabilir. Android Studio kurulurken gerekli Android SDK (Android Software Development Kit) otomatik indirilip kurulmaktadır. Kurulum sırasında değiştirilmezse SDK genellikle C:\Kullanıcılar\<KULLANICI-ADI>\AppData\Local\Android\sdk yolundadır. Android Studio’nun içerisindeki Tools->Android menüsünden SDK, AVD (Android Virtual Device-Android Sanal Aygıtı) ve diğer uygulamalara ulaşılabilir, ayarlarında değişiklik ve düzenlemeler yapılabilir.

ANDROID SDK VE API LEVEL NEDİR?

Her programlama dilinde o programlama diline özgü fonsiyonlar ve kütüphaneler vardır. Genellikle programlama dillerinin o dilin programcılarına gerekli bu fonksiyonları ve kütüphaneleri içeren SDK paketleri bulunur. SDK paketleri programlama dili kurulurken beraber veya sonradan programcı tarafından elle kurulabilir. Android de ilk sürümden itibaren Android programcıları için her sürümde ayrı SDK paketi çıkartılmıştır. Android 1 sürümünde API seviyesi (API Level) 1 iken, 7.1 sürümünde API seviyesi 25’dir.

Android Studio’da yeni uygulamaya başlanırken Minimum SDK seçme sayfası gelecektir. Düşük API seviyesi seçilirse uygulama tüm tablet veya telefonlar ile uyumlu olacaktır. Fakat düşük API seviyeleri yeni fonksiyonları ve özellikleri içermez. Yüksek API seviyeleri ise eski tablet veya telefonlar ile uyumlu olmayacaktır. Bu sebeplerden dolayı uygulama için uygun API seviyesi seçilmelidir.

Tüm API seviyeleri indirilebilir. Fakat sabit diskte ciddi yer kaplayacağı için bu tavsiye edilmez. Uygulama için minimum, maksimum ve hedef api seviyelerini yüklemek yeterlidir.

ANDROID STUDIO’DA YENİ BİR PROJEYE BAŞLAMA

Kurulumlar bittikten sonra Android Studio çalıştırılır. Gelen Welcome ekranında “Start a new Android Studio Project” seçeneği ile yeni bir uygulamaya başlanır. “Open an existing Android Studio Project” seçeneği ile var olan Android Studio uygulaması tekrar açılabilir. “Import project (Eclipse ADT, Gradle etc.)” seçeneği ile var olan Eclipse vb uygulamalar Android Studio uygulamasına dönüştürülebilir.

Bir uygulama oluşturulduktan veya açıldıktan sonra Android Studio’da kapatılırsa Android Studio tekrar açıldığında Welcome ekranının sol tarafında oluşacak listede yer alacaktır. Buraya tıklanarak hemen Android Studio ile açılabilir. Uygulama kapatılmadan sadece Android Studio kapatılırsa sonra açılışta aktif uygulama otomatik açılır.

Yeni uygulamada Application Name kısmına uygulamanın ismi, Company Domain kısmına ise uygulamanın web adresi yazılmalıdır. Package name kısmı otomatik dolacaktır. Bu kısım Edit bağlantısına tıklandığında gelecek edit kutusundan değiştirilebilir. Project Location kısmından proje yolu değiştirilebilir.

Next butonu ile Android SDK seçme sayfasına geçildiğinde Phone and Tablet kısmından Minumum SDK seçilmelidir. Burada uygulama için uygun SDK seçilmelidir.

Next butonu ile Activity seçme sayfasına geçilir. Activity uygulamanın nasıl görüneceğini belirler. Bu sayfada uygulama için uygun Activity seçilir. Uygulama için Empty Activity‘yi (Boş aktivite) seçilmektedir.

Next butonu ile gelinen son sayfada Activity Name kısmında istenen Aktivite ismi ve Layout Name kısmına istenen Layout ismi yazılır. Finish butonu ile yeni uygulamaya başlanmış olur.

Projenin önce tasarımı yapılır. Projenin app->res->layout kısmında aktivite ismi ile aynı isme sahip xml (proje için activity_yakit.xml) dosyasına tıklanarak tasarım kısmı açılır. Bu kısımda Design tabı ile doğrudan tasarım yapılabilir.

Text tabında xml dosyası doğrudan değiştirilebilir. En sağdaki Preview kısmında yapılan tasarım görüntülenir.

Normalde yeni projede bu xml dosyada Layout, RelativeLayout olarak (2.satır) tanımlıdır. Fakat uygulamada bu TableLayout olarak değiştirildi. Her Layout’un kendine göre avantaj ve dezavantajları vardır. Uygulamada 7 adet TextView, 3 adet EditText ve 2 adet Button bulunmaktadır. activity_yakit.xml aşağıdaki şekildedir:

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.dm7blog.yakithesap.YakitActivity">

    <TableRow
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:gravity="center_horizontal">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_span="2"
            android:text="Yapilan Km  : 0"
            android:id="@+id/tvYapilankm"
            android:textAppearance="?android:attr/textAppearanceMedium" />
    </TableRow>

    <TableRow
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:gravity="center_horizontal">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_span="2"
            android:text="Km'de yakilan : 0 kuruş"
            android:id="@+id/tvKmdeyakilan"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:singleLine="true" />
    </TableRow>

    <TableRow
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:gravity="center_horizontal">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_span="2"
            android:text="Harcama : 0 lira"
            android:id="@+id/tvHarcama"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:singleLine="true" />
    </TableRow>

    <TableRow
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:gravity="center_horizontal">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Varış Km :"
        android:id="@+id/tvVariskm"/>

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="numberDecimal"
        android:id="@+id/etVariskm"
        android:text="0"
        android:ems="7"/>
    </TableRow>

    <TableRow
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:gravity="center_horizontal">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Kalkış Km :"
        android:id="@+id/tvKalkiskm"/>

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="numberDecimal"
        android:id="@+id/etKalkiskm"
        android:text="0"
        android:ems="7"/>
    </TableRow>

    <TableRow
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:gravity="center_horizontal">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Ortalama Tüketim :"
        android:id="@+id/tvOrtalama"/>

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="numberDecimal"
        android:id="@+id/etOrtalama"
        android:text="0"
        android:ems="7"/>
    </TableRow>

    <TableRow
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:gravity="center_horizontal">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Yakıt Fiyatı :"
        android:id="@+id/tvFiyat" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="numberDecimal"
        android:id="@+id/etFiyat"
        android:ems="7"
        android:text="0" />
    </TableRow>

    <TableRow
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:gravity="center_horizontal">
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Temizle"
            android:id="@+id/btTemizle" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hesapla"
            android:id="@+id/btHesapla"/>
    </TableRow>

    <TableRow
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:gravity="center_horizontal">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Sürüm : "
            android:id="@+id/tvSurum"
            android:layout_span="1"/>
    </TableRow>
</TableLayout>

Uygulamanın app->src->main->java-><PAKET İSMİ (Package Name)> kısmında java (proje için YakitActivity.java) dosyasına tıklanarak kod girme kısmı açılır.

Uygulamada Hesapla butonu ile EditText’lerden aldığı değerleri göre hesaplama yapmakta ve sonuçları TextView’lerde göstermektedir. Uygulama girilen değerleri hafızada saklayabilmekte ve açılışta otomatik yüklemektedir. Temizle butonuyla ise EditText’ler deki ve hafızada saklanan değerler sıfırlanmaktadır. Aşağıdaki YakitActivity.java dosyasında uygulamanın kodları bulunmaktadır:

package com.dm7blog.yakithesap;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.content.SharedPreferences;
import android.content.Context;

public class YakitActivity extends AppCompatActivity {
    EditText vkm;
    EditText kkm;
    EditText ort;
    EditText fiyat;
    TextView ykm;
    TextView kmyakilan;
    TextView hrcm;
    TextView surum;
    Button bthesapla;
    Button bttemizle;
    SharedPreferences sprefs;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_yakit);
        vkm = (EditText)findViewById(R.id.etVariskm);
        kkm = (EditText)findViewById(R.id.etKalkiskm);
        ort = (EditText)findViewById(R.id.etOrtalama);
        fiyat = (EditText)findViewById(R.id.etFiyat);
        ykm = (TextView)findViewById(R.id.tvYapilankm);
        kmyakilan = (TextView)findViewById(R.id.tvKmdeyakilan);
        hrcm = (TextView)findViewById(R.id.tvHarcama);
        surum = (TextView)findViewById(R.id.tvSurum);
        surum.setText("Sürüm : "+BuildConfig.VERSION_NAME);

        sprefs = getSharedPreferences("Ayarlarim", Context.MODE_PRIVATE);
        //Ayarlar okunuyor
        ayarlarioku();

        bthesapla = (Button)findViewById(R.id.btHesapla);
        bthesapla.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                hesapla();
                ayarlarisakla();
            }
        });

        bttemizle = (Button)findViewById(R.id.btTemizle);
        bttemizle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                vkm.setText("0");
                kkm.setText("0");
                ort.setText("0");
                fiyat.setText("0");
                ykm.setText("Yapilan Km : 0");
                kmyakilan.setText("Km'de yakilan : 0 kuruş");
                hrcm.setText("Harcama : 0 lira");
                ayarlarisil();
            }
        });
    }

    public void hesapla() {
        float hvariskm;
        float hkalkiskm;
        float hyapilankm;
        float hortalama;
        float hfiyat;
        float hkmdeyakilan;
        float hharcama;

        hvariskm = Float.parseFloat(vkm.getText().toString());
        hkalkiskm = Float.parseFloat(kkm.getText().toString());
        hyapilankm = hvariskm - hkalkiskm;
        ykm.setText("Yapilan Km : " + String.format("%.2f", hyapilankm));
        hortalama = Float.parseFloat(ort.getText().toString());
        hfiyat = Float.parseFloat(fiyat.getText().toString());
        hkmdeyakilan = hortalama * hfiyat;
        kmyakilan.setText("Km'de yakilan : " + String.format("%.2f", hkmdeyakilan) + " kuruş");
        hharcama = hyapilankm * (hkmdeyakilan / 100);
        hrcm.setText("Harcama : " + String.format("%.2f", hharcama) + " lira");
    }

    public void ayarlarioku() {
        // Ayarlar okunuyor
        vkm.setText(sprefs.getString("VarisKm", "0"));
        kkm.setText(sprefs.getString("KalkisKm", "0"));
        ort.setText(sprefs.getString("Ortalama", "0"));
        fiyat.setText(sprefs.getString("Fiyat", "0"));
        ykm.setText(sprefs.getString("YapilanKm", "Yapilan Km : 0"));
        kmyakilan.setText(sprefs.getString("Kmdeyakilan", "Km'de yakilan : 0 kuruş"));
        hrcm.setText(sprefs.getString("Harcama", "Harcama : 0 lira"));
    }

    public void ayarlarisakla() {
        SharedPreferences.Editor editor = sprefs.edit();
        // Ayarlar kaydediliyor
        editor.putString("VarisKm", vkm.getText().toString());
        editor.putString("KalkisKm", kkm.getText().toString());
        editor.putString("Ortalama", ort.getText().toString());
        editor.putString("Fiyat", fiyat.getText().toString());
        editor.putString("YapilanKm", ykm.getText().toString());
        editor.putString("Kmdeyakilan", kmyakilan.getText().toString());
        editor.putString("Harcama", hrcm.getText().toString());
        editor.commit();
    }

    public void ayarlarisil() {
        SharedPreferences.Editor editor = sprefs.edit();
        // Ayarlar siliniyor
        editor.remove("VarisKm");
        editor.remove("KalkisKm");
        editor.remove("Ortalama");
        editor.remove("Fiyat");
        editor.remove("YapilanKm");
        editor.remove("Kmdeyakilan");
        editor.remove("Harcama");
        editor.clear();
        editor.commit();
    }
}

Android’de internete ve diğer işlemlere erişim için özel izinler gerekmektedir. Google Play’den bir uygulama yüklenirken hangi izinlere sahip olduğu belirtilir ve kurulup kurulmayacağı kullanıcıya sorulur. Eğer uygulamada izinler gerekiyorsa son olarak izinlerin ve diğer tanımların yapıldığı AndroidManifest.xml dosyası düzenlenir. Bu uygulamada özel izin yoktur.

ANDROID STUDIO’DA UYGULAMANIN DENENMESİ

Android Studio’da uygulama iki farklı şekilde denenebilir. Uygulamayı çalıştır “Run” seçeneği seçildiği zaman gelen Select Deployment Target penceresinde gerçek bir cihaza uygulamayı yükleyip gerçekten denemek veya önceden var olan sanal aygıtlardan birini seçip sanal olarak denemek mümkündür. Pencerede üst kısımda varsa gerçek cihazlar alt kısımda ise sanal cihazlar bulunmaktadır.

Uygulamayı bir cihaz üzerinde denemek için Ayarlar->Geliştirici Seçenekleri->”Usb hata ayıklama” ve Ayarlar->Güvenlik->”Bilinmeyen Kaynaklar” seçenekleri aktif olmalıdır. Bu ayarlar aktif olan cihaz Usb kablo ile bilgisayara bağlandığında Select Deployment Target‘de otomatik olarak yer alacaktır. Aşağıda Samsung S4 mini cihazında gerçek uygulamanın alınmış ilk çalışma ve hesaplamadan sonrası ekran görüntüleri bulunmaktadır :

Uygulama önceden var olan bir sanal aygıtta denenebileceği gibi programcı kendi sanal aygıtlarını oluşturup uygulamayı onlar üzerinde deneyebilir. Sanal aygıtın çalışabilmesi için Intel’in sanallaştırma (virtualization) HAXM, VT-X özelliği olan bir bilgisayar ve bilgisayarın BIOS’unda bu özelliğin aktif edilmiş olması gerekmektedir. Aşağıda sanal emulatordan alınmış ilk çalışma ve hesaplamadan sonrası ekran görüntüleri bulunmaktadır :

Reklamlar

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.