Mobil Programlama - Uygulama 5 (Kahve Sipariş 2)

Daha önce yaptığımız Kahve Sipariş uygulamasının üstüne ekleyerek devam edeceğiz.

Uygulama arayüzü şu şekilde olacak;

Uygulama'da butona bastığımızda; 0TL yazan TextView'de şu mesaj yazacak;

İsim : Kubra Sevinc
Krem Şanti eklenecek mi? : true
Adet : 2
Toplam : 10 TL
Teşekkürler!

Bunun için öncelikle;
  • checkbox'ı Java kodlarında tanıtmalıyız.
  • boolean bir değişken oluşturmalıyız. ( ben KremŞantiEklenecekMi adında bir değişken kullandım)
  • CheckBox'ın işaretlenip, işaretlenmediğini kontrol edip KremŞantiEklenecekMi değişkenine aktarmalıyız.
  • tutar TextView içerisinde mesajı göstermeliyiz.
Sonuç olarak Java kodları aşağıdaki gibi olacaktır.
public class MainActivity extends AppCompatActivity {
    int adet=0;
    boolean KremSantiEklenecekMi;

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

        final TextView siparisadet=(TextView) findViewById(R.id.adettextview);
        final TextView tutar=(TextView)findViewById(R.id.siparis_ozeti_Textview);
        Button arti=(Button)findViewById(R.id.artirbutton);
        Button eksi=(Button)findViewById(R.id.eksiltbutton);
        Button gonder=(Button) findViewById(R.id.gonderButton);
        final CheckBox onaykutusu=(CheckBox)findViewById(R.id.checkBox1);

        gonder.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                KremSantiEklenecekMi=onaykutusu.isChecked();
                Log.v("MainActivity","Krem şanti istendi mi?"+KremSantiEklenecekMi);
                String mesaj="İsim : Kubra Sevinc\n";
                mesaj+="Krem Şanti eklenecek mi? : "+ KremSantiEklenecekMi +"\n";
                mesaj+="Adet : " + adet+"\n";
                mesaj+="Toplam : " +(adet*5)+" TL\n";
                mesaj+="Teşekkürler!";
                tutar.setText(mesaj);
            }
        });

boolean değişkeni sadece true veya false değeri alabilir.
onaykutusu.isChecked() true veya falde değer döndürür. Eğer CheckBox tik atıldıysa true, atılmadıysa false değer döndürür.

LOGCAT

  • Log.v ile Logcat ekranında mesaj görüntüleme sağlanır.

SCROLLVIEW

  • Ekrana sığmayacak kadar içerik bulunan durumlarda yatay veya dikey kaydırma çubuğu (scroll) kullanmamız gerekir. Android üzerinde bunu scrollView kullaranak gerçekleştirebiliriz.

Palette üzerinden scrollview wklwdiğimizde LinearLayout kod ile birlikte xml üzerine eklenir.;

 <ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical" />
        </ScrollView>

Bu kodları kendi uygulamamıza göre düzenlemeliyiz. Uygulamadaki view'leri bu kodlardaki LinearLayout arasına kopyalacağız.
(Not : Yukarıdaki kodda LinearLayout'u direk kapattığı için( /> ) ayıca bir </LinearLayout> etiketi gözükmüyor. )


  • Kaydırma çubuğunu da ekledikten sonra Bir CheckBox daha ekliyoruz. Bu kez Çikolata seçeneğini de sunacağız. Krem şanti için yapılan işlemlerin aynısını çikolata için de yapıyoruz.

EDITTEXT

  • Uygulamaya EditText ekleyerek devam ediyoruz. Bu editText ile kullanıcı isim girecek, ve sipariş özetinde bu isim görünecek. 



<EditText
            android:id="@+id/editText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="16dp"
            android:ems="10"
            android:hint="İsim"
            android:inputType="textCapWords" />
  • textCapWords -> Her kelime için klavede büyük harf ile başlaması için
  • hint -> ipucu, o metin alanına hangi bilginin yazılacağını gösterir. (bir nevi c#'daki tooltip gibi)
  • EditText'e yazılan yazıyı java kodları içerisinde kullanabilmek için EditText'in getText( ) metodunu kullanacağız. 
  • Ayrıca, krem şanti seçildiğinde 1 bardak fiyatı olan 5TL üzerine 1TL, çikolata seçildiğinde 2TL eklenecek şekilde kodları ekleyelim.

TOAST

  • Kullanıcı ( - ) butonuna çok kez bastığında sipariş adeti negatif sayılara inecek ve programcı olarak bunu istemeyiz. Ayrıca, (+) butonuna çok fazla basıldığında ise, örneğin; 10 000 adet siparişi karşılamak mümkün olmayacaktır. Bu yüzden verilebilecek sipariş adedi 1 -100 aralığında olmalıdır. Bunun için gerekli kodları da ekleyelim. Burada "Sınırı aştınız" mesajını Toast ile vereceğiz.
Toast.makeText(getApplicationContext(), "Sınırı aştınız", Toast.LENGTH_LONG).show();

INTENT

  • Uygulamamız ile verilen sipariş özetini mail atmak istiyoruz. Bir uygulamadan, başka bir uygulamaya bağlanmak için INTENT kullanacağız. Bu örneğimizde Uygulamamız email uygulamasına bağlanarak mail atacak. 
(Not: Email uygulaması Google Api ile kurulmayan emülatörlerde çalışmayabilir. Emülatör kurulumu yaparken Google Api dahil olan sürümü kurarsanız ve email tanımlaması yaparsanız emülatörde çalışabilir. Upraşmak istemiyoruzsanız telefonunuzda çalıştırmanız daha iyi olacaktır.)
                Intent intent= new Intent(Intent.ACTION_SENDTO);
                intent.setData(Uri.parse("mailto:")); // only email apps should handle this
                intent.putExtra(Intent.EXTRA_SUBJECT, emailkonu);
                intent.putExtra(Intent.EXTRA_TEXT, mesaj);
                if (intent.resolveActivity(getPackageManager()) != null) {
                    startActivity(intent);
                }


Intent kavramı, iki kişinin birbirine top atarak oynadığı bir oyun gibi düşünülürse, atılan top Intentdir ve içinde bazı verileri bulundurur. Topun içerisinde ACTION ve  DATA ile karşıdaki kişiye gönderilir.
ACTION_SENDTO ile email göndermek istediğimizi, telefondaki varsayılan email uygulamasına gönderim yapılmasını söylüyoruz. Ayrıntılı bilgi için (https://youtu.be/8fQXKuk6DGuY)
  
EXRA_SUBJECT ile email konu kısımda ne yazacağını, EXTRA_TEXT ile de metin kısmında ne yazacağını belirtiyoruz. 


STİLLER (Styles)

Uygulamanın biçimsel özellikleri her bir textview ile ayrı ayrı yazılmak yerine styles.xml üzerinden bir kez yazılıp diğer textview'lere eklenebilir. (CSS mantığı ile birebir aynı)

Klasördeki yolu;
app -> res -> values -> styles.xml

Bu uygulamada, styles.xml'de Soslar, Adet ve Sipariş özeti textview'lerinin stillerini belirliyoruz. 
    <style name="BaslikTextView" parent="TextAppearance.AppCompat">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">48dp</item>
        <item name="android:gravity">center_vertical</item>
        <item name="android:textAllCaps">true</item>
        <item name="android:textSize">16sp</item>
    </style>

activity.xml dosyasında ise şu şekilde belirtiyoruz.

            <TextView
            style="@style/BaslikTextView"
            android:layout_marginBottom="16dp"
            android:layout_marginLeft="16dp"
            android:text="Adet :"
            />

TEMALAR (Themes)

Uygulamaların, renklerini değiştirmek için kullanılan bölümdür. Üst bar, alt bar, yazı rengi vb. renkleri tema ayarları ile değiştirebiliriz.

Renk seçimi için https://www.materialpalette.com/ sitesini kullanabilirsiniz. Material Palette sitesinden 2 renk seçtiğinizde hangi kısma hangi renk kodu yazılacak veriyor. 

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">#FF5722</item>
        <item name="colorPrimaryDark">#E64A19</item>
        <item name="colorAccent">#CDDC39</item>
    </style>


activity.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

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

        <EditText
            android:id="@+id/editText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="16dp"
            android:ems="10"
            android:hint="İsim"
            android:inputType="textCapWords" />

        <TextView
            android:id="@+id/textView"
            style="@style/BaslikTextView"
            android:layout_marginBottom="16dp"
            android:layout_marginLeft="16dp"
            android:text="Soslar" />

        <CheckBox
            android:id="@+id/checkBox1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="16dp"
            android:layout_marginLeft="8dp"
            android:paddingLeft="24dp"
            android:text="Krem Şanti"
            android:textSize="16sp" />

        <CheckBox
            android:id="@+id/checkBox2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="16dp"
            android:layout_marginLeft="8dp"
            android:paddingLeft="24dp"
            android:text="Çikolata"
            android:textSize="16sp" />

        <TextView
            style="@style/BaslikTextView"
            android:layout_marginBottom="16dp"
            android:layout_marginLeft="16dp"
            android:text="Adet :"
            />

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="16dp"
            android:layout_marginLeft="16dp"
            android:orientation="horizontal">

            <Button
                android:id="@+id/eksiltbutton"
                android:layout_width="48dp"
                android:layout_height="48dp"
                android:layout_marginRight="8dp"
                android:layout_weight="1"
                android:text="-" />

            <TextView
                android:id="@+id/adettextview"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="8dp"
                android:layout_weight="1"
                android:text="0"
                android:textColor="#000000"
                android:textSize="16sp" />

            <Button
                android:id="@+id/artirbutton"
                android:layout_width="48dp"
                android:layout_height="48dp"
                android:layout_marginRight="8dp"
                android:layout_weight="1"
                android:text="+" />
        </LinearLayout>

        <TextView
            android:id="@+id/textView2"
            style="@style/BaslikTextView"
            android:layout_marginBottom="16dp"
            android:layout_marginLeft="16dp"
            android:text="Sipariş Özeti:" />

        <TextView
            android:id="@+id/siparis_ozeti_Textview"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="16dp"
            android:layout_marginLeft="16dp"
            android:text="0 TL"
            android:textColor="#000000"
            android:textSize="16sp" />

        <Button
            android:id="@+id/gonderButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="16dp"
            android:text="Gönder" />

    </LinearLayout>
</ScrollView>



Mainactivity.java
package com.example.kubramevlut.uygulama3;

import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.TextView;
import android.widget.Toast;


import org.w3c.dom.Text;

public class MainActivity extends AppCompatActivity {
    int adet = 0, birbardakfiyati = 5;
    boolean KremSantiEklenecekMi, cikolataEklenecekMi;
    String emailkonu="Kahveciyiz uygulamasından Siparişiniz var";

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


        final TextView siparisadet = (TextView) findViewById(R.id.adettextview);
        final TextView tutar = (TextView) findViewById(R.id.siparis_ozeti_Textview);
        Button arti = (Button) findViewById(R.id.artirbutton);
        Button eksi = (Button) findViewById(R.id.eksiltbutton);
        Button gonder = (Button) findViewById(R.id.gonderButton);
        final CheckBox chKremSanti = (CheckBox) findViewById(R.id.checkBox1);
        final CheckBox chCikolata = (CheckBox) findViewById(R.id.checkBox2);

        gonder.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                KremSantiEklenecekMi = chKremSanti.isChecked();
                cikolataEklenecekMi= chCikolata.isChecked();
                if (KremSantiEklenecekMi) {
                    birbardakfiyati = birbardakfiyati + 1;
                }
                if (cikolataEklenecekMi) {
                    birbardakfiyati = birbardakfiyati + 2;
                }
                Log.v("MainActivity", "Krem şanti istendi mi?" + KremSantiEklenecekMi);
                String mesaj = "İsim : Kubra Sevinc\n";
                mesaj += "Krem Şanti eklenecek mi? : " + KremSantiEklenecekMi + "\n";
                mesaj += "Çikolata eklenecek mi? : " + cikolataEklenecekMi + "\n";
                mesaj += "Adet : " + adet + "\n";
                mesaj += "Toplam : " + (adet * birbardakfiyati) + " TL\n";
                mesaj += "Teşekkürler!";
                tutar.setText(mesaj);

                Intent intent= new Intent(Intent.ACTION_SENDTO);
                intent.setData(Uri.parse("mailto:")); // only email apps should handle this
                intent.putExtra(Intent.EXTRA_SUBJECT, emailkonu);
                intent.putExtra(Intent.EXTRA_TEXT, mesaj);
                if (intent.resolveActivity(getPackageManager()) != null) {
                    startActivity(intent);
                }
            }
        });

        arti.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (adet > 100) {
                    Toast.makeText(getApplicationContext(), "Sınırı aştınız", Toast.LENGTH_LONG).show();
                } else {
                    adet = adet + 1;
                    siparisadet.setText("" + adet);
                }
            }
        });

        eksi.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (adet < 1) {
                    Toast.makeText(getApplicationContext(), "Sınırı aştınız", Toast.LENGTH_LONG).show();

                } else {
                    adet = adet - 1;
                    siparisadet.setText("" + adet);
                }

            }
        });


    }

}



Kaynak : Udacity

NOT : Udacity eğitimlerinde bu uygulamada özellikle metotlar kullanılıyor. Meslek Yüksekokulu Bilgisayar Programcılığı Bölümünde bu dersi anlattığım için öncelikle Android yapısını öğrenmelerine önem verdim. Bu sebeple kodlarda ayrı metotlar kullanmadım. Bu uygulamadan sonra Udacity eğitimlerinden biraz ayrılıp, buraya kadar verilen bilgiler ile farklı uygulamalar üzerinden devam edeceğiz. 

Yorumlar

Bu blogdaki popüler yayınlar

SQLite Değişken tipleri ve Komutları

Mobil Programlama - Not Hesaplama Uygulaması

Sistem Analizi ve Tasarımı Proje Sonu Bilgilendirme