Android Veritabanı ListView kullanımı

Bir önceki projemizde Android'te veritabanı kullanımını anlatmıştık. Örneğimizde kayıt listelemek için textView nesnesi kullanmıştık. Aynı örneği bir de listview kullanarak tekrarlayacağız. İki projede de aynı olan bölümleri tekrar etmeyip sadece farklı olan kısımları işleyeceğim. İlk değişikliğimiz vtIslem.java dosyasında tumKayitlar() methodunda olacak.  

	public ArrayAdapter<String> tumKayitlar(Context context) 
	{
        String[] sutunlar = new String[] { "ad", "soyad", "tel"};
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor c = db.query("rehber", sutunlar, null, null,null, null, null);

        int adSiraNo = c.getColumnIndex("ad");
        int soyadSiraNo = c.getColumnIndex("soyad");
        int telSiraNo = c.getColumnIndex("tel");
        String dizi[]=new String[c.getCount()];
        int sayac=0;
        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
        	dizi[sayac]=c.getString(adSiraNo) + "    "  + c.getString(soyadSiraNo) + "  " + c.getString(telSiraNo);
        	sayac+=1;
        }

        ArrayAdapter AA= new ArrayAdapter<String>(context,android.R.layout.simple_list_item_1,dizi);  
        return AA;
    }

      activity_main.xml dosyamız aşağıdaki gibi düzenliyoruz. Önceki projeden farklı olarak textview değil composite menüsünden ListView nesnesi kullanıyoruz.

   

MainActivity.java dosyasında; Sınıfın genel deklarasyon bölümünde adaptör isimli bir değişken tanımlıyoruz.  

ArrayAdapter adaptor;

oncreate methodunda listviewimizi tanıtıyoruz.  

final ListView lvKayitlar=(ListView)findViewById(R.id.lvKayitlar);

  Aynı yerde veritabanındaki kayıtları çekiyoruz.  

		adaptor= vtIslem.tumKayitlar(getApplicationContext());
        	lvKayitlar.setAdapter(adaptor);
        	lvKayitlar.setTextFilterEnabled(true);

      buton içerisinde de kayıt eklendikten sonra güncel veritabanını görüntülemek için kayıtları tekrar adaptöre alıyoruz.

        adaptor= vtIslem.tumKayitlar(getApplicationContext());

        lvKayitlar.setAdapter(adaptor);

      Hepsi bu kadar. Aşağıda örnek için yazılan tüm kodlar verilmiştir.   vtIslem.java  

package com.enverkulahli.e03veritabani;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.ArrayAdapter;

public class vtIslem extends SQLiteOpenHelper 
{

	public vtIslem(Context context, String name, CursorFactory factory,
			int version) 
	{
		super(context, name, factory, version);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void onCreate(SQLiteDatabase db) 
	{
		// TODO Auto-generated method stub
		db.execSQL("CREATE  TABLE  IF NOT EXISTS rehber (id INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL , ad VARCHAR, soyad VARCHAR, tel VARCHAR)");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
	{
		// TODO Auto-generated method stub
		db.execSQL("DROP TABLE IF EXIST rehber;");
	}

	public void kayitekle( String adi,String soyadi, String tel)
	{
		SQLiteDatabase db=this.getWritableDatabase();
		db.execSQL("INSERT INTO rehber(ad,soyad,tel) VALUES('" + adi + "','" + soyadi + "','" + tel + "')");

	}

	public ArrayAdapter<String> tumKayitlar(Context context) 
	{
        String[] sutunlar = new String[] { "ad", "soyad", "tel"};
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor c = db.query("rehber", sutunlar, null, null,null, null, null);

        int adSiraNo = c.getColumnIndex("ad");
        int soyadSiraNo = c.getColumnIndex("soyad");
        int telSiraNo = c.getColumnIndex("tel");
        String dizi[]=new String[c.getCount()];
        int sayac=0;
        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
        	dizi[sayac]=c.getString(adSiraNo) + "    "  + c.getString(soyadSiraNo) + "  " + c.getString(telSiraNo);
        	sayac+=1;
        }

        ArrayAdapter AA= new ArrayAdapter<String>(context,android.R.layout.simple_list_item_1,dizi);  
        return AA;
    }

}

MainActivity.java  

package com.enverkulahli.e03veritabani;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity 
{
	private vtIslem vtIslem;
	ArrayAdapter adaptor;

		@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		vtIslem=new vtIslem(this, "rehber", null, 1);

		final EditText txtAd=(EditText)findViewById(R.id.txtAd);
		final EditText txtSoyad=(EditText)findViewById(R.id.txtSoyad);
		final EditText txtTel=(EditText)findViewById(R.id.txtTel);
		Button btnKaydet=(Button)findViewById(R.id.btnKaydet);
		final TextView tvSonuc=(TextView)findViewById(R.id.tvSonuc);
		//final TextView tvKayitlar=(TextView)findViewById(R.id.tvKayitlar);
		final ListView lvKayitlar=(ListView)findViewById(R.id.lvKayitlar);

		adaptor= vtIslem.tumKayitlar(getApplicationContext());
        lvKayitlar.setAdapter(adaptor);
        lvKayitlar.setTextFilterEnabled(true); 

		btnKaydet.setOnClickListener(new View.OnClickListener() 
		{
			@Override
			public void onClick(View arg0) 
			{
				vtIslem.kayitekle( txtAd.getText().toString(), txtSoyad.getText().toString(), txtTel.getText().toString());
				tvSonuc.setText("kayıt girildi");	

				adaptor= vtIslem.tumKayitlar(getApplicationContext());
		        lvKayitlar.setAdapter(adaptor);
		        //lvKayitlar.setTextFilterEnabled(true); 
		        //tvKayitlar.setText(tumKayitlar);

			}
		});

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

Activity_main.xml  

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_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=".MainActivity" >

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView2"
        android:layout_below="@+id/textView2"
        android:layout_marginTop="29dp"
        android:text="Ad"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/TextView01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView2"
        android:layout_below="@+id/textView2"
        android:layout_marginTop="70dp"
        android:text="Soyad"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/TextView02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_below="@+id/textView1"
        android:layout_marginTop="65dp"
        android:text="Telefon"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <Button
        android:id="@+id/btnKaydet"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginLeft="27dp"
        android:layout_toRightOf="@+id/TextView02"
        android:text="Kaydet" />

    <TextView
        android:id="@+id/tvSonuc"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/TextView02"
        android:layout_alignRight="@+id/txtTel"
        android:layout_below="@+id/btnKaydet"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <EditText
        android:id="@+id/txtAd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/btnKaydet"
        android:layout_alignTop="@+id/textView1"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <EditText
        android:id="@+id/txtSoyad"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/txtAd"
        android:layout_alignTop="@+id/TextView01"
        android:ems="10" />

    <EditText
        android:id="@+id/txtTel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/txtSoyad"
        android:layout_alignTop="@+id/TextView02"
        android:ems="10"
        android:inputType="phone" />

    <ListView
        android:id="@+id/lvKayitlar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/tvSonuc"
        android:layout_below="@+id/btnKaydet"
        android:layout_marginTop="51dp"
         >
    </ListView>

</RelativeLayout>

     

Android Veritabanı

Öncelikle Android ortamında veritabı işlemlerini kolaylaştırabilmek için bir adet sınıf oluşturacağız. Oluşturacağımız sınıfı SQLiteOpenHelper'dan extend etmemiz gerekiyor ki veritabanı işlemlerini bu sınıfta gerçekleştirebilelim. Bu işlem için package explorer ekranında src klasörü içindeki paketimize sağ tıklayarak new-class seçeneğini işaretliyoruz.

 

Oluşturduğumuz sınıfa vtIslem ismini verdim. vtIslem sınıfını SQLiteOpenHelper'dan extend ediyoruz.  

Oluşturduğumuz sınıfın onCreate ve onUpgrade method'larını tanımlamamız gerekiyor. Bunun için Source- override implement methods'a gelip onCreate ve onUpgrade seçenekleri işaretliyken ok butonuna basıyoruz. Böylelikle onCreate ve onUpgrade methodları kod kısmına ekleniyor.  

vtIslem sınıfının altı çizi yani hata veriyor. Bu hatadan kurtulabilmek için constructor oluşturmamız gerekiyor. Hatanın üzerine fareyle gelip "add constructor" linkine (ben 1. Seçeneği tercih ettim şu an için DatabaseErrorHandler kullanmayacağım) tıklıyoruz.  

vtIslem sınıfı içerisinde olluşturmuş olduğumuz onCreate methodu, proje çalıştığında veritabanı yoksa veritabanı oluşturmak için kullanılacak. onUpgrade methodu ise projemizde bir güncelleme yaptığımızda veritabanının silinmesi için kullanılacaktır. Eski verileri saklamak ve güncellemeden sonra da kullanmak istiyorsak taşıma gibi işlemleri de bizim oluşturmamız gerekiyor. Bu örnekte upgrade işleminde eğer veritabanı varsa silinecektir.   Veritabanı oluşturmak silmek gibi komutları bizim oluşturmamız gerekiyor. Bunu farklı örnek sitelerinden yapabilir ya da bir editör kullanabiliriz. Ben bu örnekte Mozilla Firefox'un sqlite eklentisini kullanacağım.

Firefox ekranında Menü-Eklentiler ekranında sqlite manager'ı arattırıp kurabilirsiniz. Sonrasında menü-web geliştirici-sqlite manager bağlantısına tıklayarak SQLite Manager uygulamasını başlatıyoruz.

Sqlite manager ekranında yeni bir veritabanı oluşturuyoruz. Table üzerine sağ tıklayarak new table diyoruz ve Veritabanı içerisinde oluşturmak istediğimiz tablo özelliklerini girerek bir tablo oluşturuyoruz (if not exists seçeneğini işaretlemeyi unutmayın).

Bu ekranda ok tuşuna bastığımızda bize tablo oluşturak için gerekli olan kodu verecektir.

Burdaki kodu kopyalayarak oncreate methodunun içine db.execSQL(""); koduyla birlikte yapıştırıyoruz. Bu işlemde tırnak işaretlerine dikkat etmeniz gerekmektedir. Kodun son hali şöyle olmalıdır.    

db.execSQL("CREATE TABLE IF NOT EXISTS rehber (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , ad VARCHAR, soyad VARCHAR, tel VARCHAR)");

  Benzer şekilde sqlite manager'da oluşturduğumuz tabloyu silerek onUpgrade eventının kodunu da kopyalıyoruz. Drop table komutuna if exist deyimini de ekleyerek düzenliyoruz. Aynı zamanda veritabanını sildikten sonra yenisini oluşturmak için oncreate methodunu da tekrar çağırıyoruz. vtIslem sınıfında onUpgrade methodunun son hali şöyle olmalıdır.  

db.execSQL("DROP TABLE IF EXIST rehber;");

onCreate(db);

Artık sınıfımız içinde kullanacağımız kayıt ekleme ve kayıtları listeleme methodlarımızı oluşturabiliriz. Kayıt eklemek için kullanacağımız method şu şekildedir:    

	public void kayitekle( String adi,String soyadi, String tel)
	{
		SQLiteDatabase db=this.getWritableDatabase();
		db.execSQL("INSERT INTO rehber(ad,soyad,tel) VALUES('" + adi + "','" + soyadi + "','" + tel + "')");
	}

Tüm kayıtları görüntülemek için kullanacağımız metod ise şu şekilde:  

	public String tumKayitlar() 
	{
        String[] sutunlar = new String[] { "ad", "soyad", "tel"};
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor c = db.query("rehber", sutunlar, null, null,null, null, null);
        String tumKayitlar = "";

        int adSiraNo = c.getColumnIndex("ad");
        int soyadSiraNo = c.getColumnIndex("soyad");
        int telSiraNo = c.getColumnIndex("tel");

        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {

            tumKayitlar = tumKayitlar + c.getString(adSiraNo) + "    "
                    + c.getString(soyadSiraNo) + "  " 
            		+ c.getString(telSiraNo)   + " \n";
        }

        return tumKayitlar;
    }

vtIslem Sınıfımızdaki işlemlerimiz bu kadar. Öncelikle activity_main.xml dosyamız aşağıdaki gibi düzenliyoruz.  

 

Artık mainActivity.java dosyamıza geçerek oradaki işlemlerimizi gerçekleştirebiliriz. Öncelikle genel deklarasyonda vtIslem sınıfımızdan bir değişken oluşturuyoruz.

 

private vtIslem vtIslem;

  oncreate methodunda ise bu değişken içine vtIslem sınıfından bir nesne türetiyoruz.

vtIslem=new vtIslem(this, "rehber", null, 1);

 

activity_main.xml içerisinde oluşturduğumuz bileşenleri tanıtıyoruz.  

		final EditText txtAd=(EditText)findViewById(R.id.txtAd);
		final EditText txtSoyad=(EditText)findViewById(R.id.txtSoyad);
		final EditText txtTel=(EditText)findViewById(R.id.txtTel);
		Button btnKaydet=(Button)findViewById(R.id.btnKaydet);
		final TextView tvSonuc=(TextView)findViewById(R.id.tvSonuc);
		final TextView tvKayitlar=(TextView)findViewById(R.id.tvKayitlar);
		btnKaydet.setOnClickListener(new OnClickListener() 
		{
			@Override
			public void onClick(View arg0) 
			{
				// TODO Auto-generated method stub

			}
		});

Butonun onclick methodunda kullanıcıdan aldığımız bilgileri veritabanına kaydediyor ve tüm kayıtları text view nesnemizde gösteriyoruz.  

vtIslem.kayitekle( txtAd.getText().toString(), txtSoyad.getText().toString(), txtTel.getText().toString());
			tvSonuc.setText("kayıt girildi");	

		      String tumKayitlar=vtIslem.tumKayitlar();
		      tvKayitlar.setText(tumKayitlar);

Ve sonuç…

 

Hepsi bu kadar. Aşağıda örnek için yazılan tüm kodlar verilmiştir.   vtIslem.java  

package com.enverkulahli.e03veritabani;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class vtIslem extends SQLiteOpenHelper 
{

	public vtIslem(Context context, String name, CursorFactory factory,
			int version) 
	{
		super(context, name, factory, version);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void onCreate(SQLiteDatabase db) 
	{
		// TODO Auto-generated method stub
		db.execSQL("CREATE  TABLE  IF NOT EXISTS rehber (id INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL , ad VARCHAR, soyad VARCHAR, tel VARCHAR)");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
	{
		// TODO Auto-generated method stub
		db.execSQL("DROP TABLE IF EXIST rehber;");
	}

	public void kayitekle( String adi,String soyadi, String tel)
	{
		SQLiteDatabase db=this.getWritableDatabase();
		db.execSQL("INSERT INTO rehber(ad,soyad,tel) VALUES('" + adi + "','" + soyadi + "','" + tel + "')");


	}

	public String tumKayitlar() 
	{
        String[] sutunlar = new String[] { "ad", "soyad", "tel"};
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor c = db.query("rehber", sutunlar, null, null,null, null, null);
        String tumKayitlar = "";

        int adSiraNo = c.getColumnIndex("ad");
        int soyadSiraNo = c.getColumnIndex("soyad");
        int telSiraNo = c.getColumnIndex("tel");

        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
 
            tumKayitlar = tumKayitlar + c.getString(adSiraNo) + "    "
                    + c.getString(soyadSiraNo) + "  " 
            		+ c.getString(telSiraNo)   + " \n";
        }
 
        return tumKayitlar;
    }

	
	
	

}

MainActivity.java  

package com.enverkulahli.e03veritabani;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity 
{
	private vtIslem vtIslem;
		
		@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		vtIslem=new vtIslem(this, "rehber", null, 1);
		
		final EditText txtAd=(EditText)findViewById(R.id.txtAd);
		final EditText txtSoyad=(EditText)findViewById(R.id.txtSoyad);
		final EditText txtTel=(EditText)findViewById(R.id.txtTel);
		Button btnKaydet=(Button)findViewById(R.id.btnKaydet);
		final TextView tvSonuc=(TextView)findViewById(R.id.tvSonuc);
		final TextView tvKayitlar=(TextView)findViewById(R.id.tvKayitlar);
		btnKaydet.setOnClickListener(new OnClickListener() 
		{
			@Override
			public void onClick(View arg0) 
			{
				vtIslem.kayitekle( txtAd.getText().toString(), txtSoyad.getText().toString(), txtTel.getText().toString());
				tvSonuc.setText("kayıt girildi");	
	         
		        String tumKayitlar=vtIslem.tumKayitlar();
		        tvKayitlar.setText(tumKayitlar);
				
			}
		});

		
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

Activity_main.xml  

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_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=".MainActivity" >

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView2"
        android:layout_below="@+id/textView2"
        android:layout_marginTop="29dp"
        android:text="Ad"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/TextView01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView2"
        android:layout_below="@+id/textView2"
        android:layout_marginTop="70dp"
        android:text="Soyad"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/TextView02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_below="@+id/textView1"
        android:layout_marginTop="65dp"
        android:text="Telefon"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <Button
        android:id="@+id/btnKaydet"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginLeft="27dp"
        android:layout_toRightOf="@+id/TextView02"
        android:text="Kaydet" />

    <TextView
        android:id="@+id/tvSonuc"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/TextView02"
        android:layout_alignRight="@+id/txtTel"
        android:layout_below="@+id/btnKaydet"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <EditText
        android:id="@+id/txtAd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/btnKaydet"
        android:layout_alignTop="@+id/textView1"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <EditText
        android:id="@+id/txtSoyad"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/txtAd"
        android:layout_alignTop="@+id/TextView01"
        android:ems="10" />

    <EditText
        android:id="@+id/txtTel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/txtSoyad"
        android:layout_alignTop="@+id/TextView02"
        android:ems="10"
        android:inputType="phone" />

    <TextView
        android:id="@+id/TextView03"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/tvSonuc"
        android:layout_alignRight="@+id/txtTel"
        android:layout_below="@+id/btnKaydet"
        android:layout_marginTop="47dp"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</RelativeLayout>

   

Android Projeye yeni aktivity eklemek

Bu yazımızda projemize yeni bir activity ekleme ve ana activity'nin kapatılmasını önlemekten bahsedeceğiz. Projemize yeni bir activity eklemek için file-new-other-android activity yolunu izliyoruz. Şablon olarak blank activity seçiyoruz ve ileri diyoruz. Sıradaki adımımız birazcık önemli. Bu adımda oluşturacağımız activity'e isim veriyoruz ve ardından "Hierarchical Parent" bölümüne Mainactivity dosyamizi gösteriyoruz. Bu kısımda eclipse'te kayıtlı olan diğer projeler de göründüğü için şu anda çalıştığımız projenin activity'sini seçtiğimizden emin olmamız gerekiyor.  

İleri diyerek activity'mizi oluşturuyoruz. Mainactivity'den bir butonla 2. Activity'e geçeceğiz, bu yüzden mainactivity içine bir buton ekleyip ayarlarını yapıyoruz ve onclick eventini oluşturuyoruz. Burda bahsi geçen işlemler bir önceki konuda anlatıldığından ayrıntıya girmiyorum. Oluşturduğumuz click eventinin içine aşağıdaki kodları yazıyoruz.

                Intent intent=new Intent(MainActivity.this,Sayfa2Activity.class);

                startActivity(intent);

Projeyi çalıştırıp test ettiğimizde, butona basıldığında ikinci sayfaya gidildiğini, 2. Sayfanın geri butonuyla da ana sayfamıza döndüğümüzü görürüz. Burada ufak bir ayrıntı daha var. Bu şekilde çalıştırdığımızda 2.sayfaya gidip geri dönüldüğünde 1. Sayfa yeniden başlatılır ve (varsa) üzerinde gerçekleştirdiğimiz işlemler sıfırlanır. Bunu önlemek için; AndroidManifest.xml dosyasında xml görünümünde MainActivity'ye android:launchMode="singleInstance" kodunu ekliyoruz.

Şimdi de Sayfa2Activity.java dosyasında menüden "source-override implement methods"a gelip "onBackPressed" eventını seçiyoruz.  

Sayfa2Activity.java dosyasında onBackPressed yordamında yazan "super.onBackPressed();" komutunu siliyor ya da açıklama satırı haline getiriyoruz. Böylelikle 2. Sayfaya geçsek bile bir önceki sayfaya geri döndüğümüzde işlemimize kaldığımız yerden devam edebiliyoruz.    

Android İlk Proje: İki sayı toplama

Bir önceki yazımızda Yazılım geliştirme ortamının nasıl hazırlanacağından bahsetmiştik. Bu yazımızda da ilk uygulamamızı geliştireceğiz. Öncelikle projemizin "activity_main.xml" dosyasını açıp bazı bileşenler eklememiz gerekiyor. İki adet "medium text" (text view) sayı1 ve sayı2 labelları için. İki adet "edit text" kullanıcının girdiği sayıları okuyabilmek için. Bir "buton" kullanıcının kodumuzu çalıştırabilmesi için. Bir "large text" (text view) işlem sonucunun görünebilmesi için. Nesnelerin üzerindeki yazıları properties bölümünde text alanından değiştirebilirsiniz.

Eklediğimiz bileşenlerden editText'ler buton ve largetext nesnelerimiz bizim için çok önemlidir. Kod kısmında bunlara erişmemiz gerektiğinden bu nesnelerin id bilgilerine ihtiyaç duymaktayız. bu bilgiyi properties bölümünden id kısmından değiştirebilirsiniz. Bu proje için sayı1 için txtSayi1, sayı2 için txtSayi2, buton için btnHesapla ve son olarak sonuç için tvSonuc idlerini verdim. Buton için örnek properties:

Artık kod yazmaya başlayabiliriz. "MainActivity.java" dosyasını açıyoruz. Öncelikle dosya içerisindeki kısımları bir tanıyalım. Aşağıdaki ekran görüntüsünde açıklamalarla kısaca özetlemeye çalıştım.

İlk etapta kod yazarken ihtiyaç duyacağımız ve activity_main.xml içerisinde oluşturduğumuz nesneleri bulmamız gerekiyor. Bunun için R.java'dan faydalanacağız.

        final EditText txtSayi1=(EditText)findViewById(R.id.txtSayi1);

        final EditText txtSayi2=(EditText)findViewById(R.id.txtSayi2);

        final TextView tvSonuc=(TextView)findViewById(R.id.tvSonuc);

        Button btnHesapla=(Button)findViewById(R.id.btnHesapla);

Bileşenleri tanıtırken EditText, TextView, Button nesnelerini daha önce kullanmadığımız için tanımayacaktır ve altlarını çizecektir. Bu sorunu gidermek için ilk yöntem hatanın olduğu yerde mouse'la bekleyip açılır pencereden nesneyi import etmek. Diğer yöntem import'u elle yazmak. Son yöntem ise proje içerisindeki bütün import hatalarını düzenlemek için source menüsünden organize imports (Ctrl+Shift+O) seçeneğini kullanmaktır.

Sıradaki adımımız butonumuzun onclick eventini oluşturmaktır. Bu işlemi activity'nin oncreate event'ının içerisine yazacağız.  

		btnHesapla.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub

			}
		});

  Onclicklistener ve View bileşenleri de import edilmek isteyecektir. Bunu için de yukarıda bahsettiğimiz yöntemlerden birini kullanabilisiniz. Son adımımız dönüştürme, hesaplama ve yazdırma işlemleridir.

				float sayi1f=Float.parseFloat(txtSayi1.getText().toString());
				float sayi2f=Float.parseFloat(txtSayi2.getText().toString());
				tvSonuc.setText(String.valueOf(sayi1f+sayi2f));

  MainActivity içerisindeki tüm kodlar şu şekildedir.  

//projemizin paketi
package com.enverkulahli.ilkproje;
//projemizde ihtiyaç duyacağımız bileşenler
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

//MainActivity sınıfımız
public class MainActivity extends Activity {


	
	//activity oluşturulduğunda çalıştırılacak kısım
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		final EditText txtSayi1=(EditText)findViewById(R.id.txtSayi1);
		final EditText txtSayi2=(EditText)findViewById(R.id.txtSayi2);
		final TextView tvSonuc=(TextView)findViewById(R.id.tvSonuc);
		Button btnHesapla=(Button)findViewById(R.id.btnHesapla);
		
		btnHesapla.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				float sayi1f=Float.parseFloat(txtSayi1.getText().toString());
				float sayi2f=Float.parseFloat(txtSayi2.getText().toString());
				tvSonuc.setText(String.valueOf(sayi1f+sayi2f));
			}
		});

	}
	//option menusu oluşturulduğunda çalıştırılacak kısım
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

    Ve sonuç….

Android Yeni Proje oluşturma

Android üzerine program geliştirebilmek için http://developer.android.com adresinden "Get the SDK" linkine tıklayarak Android SDK (Software Development Kit) ve ADT (Android Developer Tools) bileşenlerinin tamamının bulunduğu paketi indiriyoruz.

Paket içerisinde;

  • Eclipse + ADT plugin
  • Android SDK Tools
  • Android Platform-tools
  • The latest Android platform
  • The latest Android system image for the emulator

Bileşenleri mevcut ve kurulum gerektirmiyor. Tüm paketi bir klasöre çıkarttıktan sonra "eclipse" uygulamasını çalıştırıyoruz. İlk proje için "File-New-Android Application Project" seçeneğine tıklıyoruz.

Açılan pencerede bilgileri doldurduktan sonra "next" butonuna tıklayarak ilerliyoruz. Şimdilik boş proje oluşturacağımızdan diğer adımlar da "next" butonuyla geçilebilir.

İşlemlerin ardından projemiz eclipse ekranına geldi. Projemizi ilk haliyle çalıştırmak için araç çubuğunda bulunan "Run" butonuna tıklıyoruz.

Run butonuna bastığımızda projeyi ne olarak çalıştırmak istediğimiz sorusuna Android Application cevabını verdikten sonra eğer sistemimizde tanımlı bir AVD (Android Virtual Device) yoksa oluşturmak isteyip istemediğimizi soracaktır. Evet cevabını vererek ADV Manager'ın açılmasını sağlıyoruz. AVD'de istediğimiz özelliklerde bir virtual device oluşturup çalıştırıyoruz.

 

Proje dosyaları otomatik olarak hazırlanacak ve projemizin "apk" uzantılı kurulum dosyası virtual device'a gönderilerek kurulacaktır. Bu adım bilgisayarınızın performansına göre biraz zaman alabilir.

Burda görülen Virtual Device, işletim sistemi ve özellikleri olarak dışardan alınan cihazların birebir kopyasıdır. Projeyi kendi cihazınızda çalıştırmadan önce burada simülasyonunu yapabilirsiniz. Küçük bir tavsiye: Çalışma esnasında AVD'yi kapatmayın, aksi takdirde her seferinde cihazın açılmasını beklemek zorunda kalırsınız. Değişiklik yapıp tekrar run ettiğinizde eski proje otomatik olarak yenisiyle değiştirilir. Son olarak projemizin önemli dosya ve klasörlerinden bahsedeceğiz:        MainActivity.java : Projemizin Kodlarını yazacağımız bölümdür. İçerisinde bulunduğu Src klasöründe birden fazla package ve içerisinde birden fazla activity bulunabilir.         R.java: Projemiz içerisindeki kodlarla kullanıcı arayüzündeki bileşenler arasındaki bağlantıyı sağlayacak dosyadır.        ilkProje.apk: Bu dosya projemizin setup dosyasıdır. Kendi cihazınızda bu dosyayı çalıştırarak program kurulumunu sağlayabilirsiniz.       activity_main.xml: Bu dosya kullanıcıya gösterilecek arayüzdür res-layout içerisinde bulunur. Res klasörü ise projemizdeki resources(kaynak)'ları ifade etmektedir.       main.xml: res-menu içerisinde bulunur ve programımızın üst menüsünü ifade eder.       Strings.xml: res-values içerisinde bulunur ve program içerisinde kullandığımız yazıları tutmakta kullanılır. Kullanımı zorunlu değildir fakat dil desteği olan bir program geliştirilecekse kolaylık sağlayacaktır.       AndroidManifest.xml: Proje yapılandırma dosyasıdır aynı zamanda proje içerisinde kullanacağımız bileşenlerin izinlerinin de alındığı bölümdür.