10 Ocak 2013 Perşembe

ADT Bundle – Android Developer Tools


Android uygulamaları geliştirmek için gerekli olan tüm araçları içerisinde barındıran bir paket. Bu paket içerisinde:
  • Eclipse(JDT, CDT, EMF, GEF, WTP) + ADT Plugin
  • Android SDK Tools
  • Android Platform-Tools
  • En güncel Android Platformu
  • Emülatorun ihtiyaç duyduğu en güncel Android imageları yer almakta
Paketi indirmek için http://developer.android.com/sdk/index.html adresindeki “Download the SDK ADT Bundle for Windows” bağlantısına tıklayın.

Andorid uygulamaları geliştirmeye yeni başlayan, Eclipse'i sadece Android uygulamaları geliştirmek için kullanan ya da daha önceki kurulum yönteminden çekinen geliştiriciler için düşünülmüş güzel bir geliştirme ortamı. Bu paketi indirip hemen uygulama geliştirmeye başlayabilirsiniz. Fakat hali hazırda bir Eclipse’iniz varsa ve bu ortamda Andorid uygulamaları geliştirmek istiyorsanız diğer yöntemi kullanarak kurulumu gerçekleştirmelisiniz(Makaleye buraya tıklayarak ulaşabilirsiniz).

Android SDK Manager açtığımızda en güncel API’nin (bu yazı yazıldığında Andorid 4.2 – API17) kurulu geldiği görülmekte. Dilerseniz diğer API’leride kurabilirsiniz.


Android Virtual Devices Manager da ise “Device Definition”(şablonlarda diyebiliriz) kısmının geldiği görülmekte. Listede bir çok hazır aygıt tanımı(şablonları) bulunmakta ama isterseniz kendi aygıt tanımlarınızı da oluşturabilirsiniz.




15 Aralık 2011 Perşembe

(Sayı Sırala - 4) OyunActivity

Bu uygulamayı indir

Oyunun oynanması için bu activity kullanacağız. Öncelikle “oyun” adında bir layout oluşturup şu şekilde bir tasarım yapalım.


 
Form üzerine bir GridView bileşeni ekliyorum.


Layout tasarımından sonra sıra geldi OyunActivity oluşturmaya src/com.ornekler.sayisirala üzerinde sağ tıklayıp New > Class komutunu verip OyunActivity  adında yeni bir sınıf oluşturun. Oluşturulan bu Activity’nin AndroidManifest.xml dosyasında kaydı yapılmalı.
<appplication></application> etikerleri arasına şu satırı yazıyoruz

<activity android:label="@string/app_name" android:name=".OyunActivity" /> 


Artık OyunActivity.java dosyasını açıp kodlamaya başlayabiliriz.

package com.ornekler.sayisirala;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.app.AlertDialog;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.GridView;

public class OyunActivity extends Activity implements OnClickListener {
 
 private Date baslamaVakti;
 private Activity activity = this;
 private Timer timer;
 private List<Button> butonlar;
 private GridView gridView;
 private int sutunSayisi;
 private int satirSayisi;
 private SayilarAdapter sayilarAdapter;
 
 private void TimerMethod()
 {
  this.runOnUiThread(Timer_Tick);
 }
 
 private Runnable Timer_Tick = new Runnable() {
  public void run() {

   Date simdikiZaman = new Date();   
   long fark = simdikiZaman.getTime() - baslamaVakti.getTime();
   simdikiZaman.setTime(fark);
   SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
   activity.setTitle( "Sayı Sırala | " + sdf.format( simdikiZaman ) );
  
  }
 };
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.oyun);
        
        //Ana Activity'den extra degeleri/verileri almak icin Bundle tanimla
        Bundle extras = getIntent().getExtras();
        
        sutunSayisi = extras.getInt("sutunSayisi");
        satirSayisi = extras.getInt("satirSayisi");
        
        butonlar = new ArrayList<Button>();
        butonlariOlustur();
        
        gridView = (GridView) findViewById(R.id.gridView1);
        gridView.setNumColumns(sutunSayisi);
        sayilarAdapter = new SayilarAdapter();
        gridView.setAdapter(sayilarAdapter);
        
        baslamaVakti = new Date();
  timer = new Timer();
  timer.schedule(new TimerTask() {
   @Override
   public void run() {
    TimerMethod();
   }

  }, 0, 1000);

    }
    
    private void butonlariOlustur(){
        
  //Butonlari olustur.
  Button button;
  Typeface font = Typeface.createFromAsset(getAssets(), "font/orangefizz.ttf");
  
  for (int n = 0; n < (satirSayisi * sutunSayisi); n++){
   
   button = new Button(this);
   //Ilk buton bosluk butonu
   if (n == 0){
    button.setText("");
    button.setBackgroundColor(0xf0f195);
   }
   else {
    button.setText(Integer.toString(n));
   }
   //Font belirle
   button.setTypeface(font);

   button.setOnClickListener(this);
   button.setHeight(64);
   button.setTextSize(30);
   
   //Listeye ekle
   butonlar.add(button);
  }
  
  //Listeyi karistiralim
  Collections.shuffle(butonlar, new Random());    
    }
    
    @Override
    public void onClick(View v) {
     Button btnTiklanan = (Button) v;
     
     //Bosluk butonu ile tiklanan butonun yerini değiştir
     yerDegistir(btnTiklanan);
     
     //Oyun bitti mi?
  kontrolEt();
    }
    
   private void yerDegistir(Button btnTiklanan){
  
    //Tiklanan butonunn konumu(index)
  int tiklananKonum = butonlar.indexOf(btnTiklanan);
  Button btnBosluk;
  
  //Bosluk butonunn konumu(index)
  int boslukKonum = -1;
  
  //Butonun hangi satirda oldugunu bul
  int bulunduguSatir = (int) Math.floor( tiklananKonum / sutunSayisi );

  //1) Sayının üstüne bakmak 
  if ( ((tiklananKonum - sutunSayisi) >= 0) ) {
   
   btnBosluk = butonlar.get(tiklananKonum - sutunSayisi);
   if (btnBosluk.getText().equals(""))
    boslukKonum = (tiklananKonum - sutunSayisi);

  }
  
  //2)Sayının altına bakmak:
  if ( (tiklananKonum + sutunSayisi) < butonlar.size()) {
   
   btnBosluk = butonlar.get(tiklananKonum + sutunSayisi);
   if (btnBosluk.getText().equals(""))
    boslukKonum = (tiklananKonum + sutunSayisi);
  }
  
  //3) Bir Önceki Konuma Bakmak: 
  if ((tiklananKonum - 1 ) >= 0 && ((tiklananKonum - bulunduguSatir * sutunSayisi) != 0) ){
   
   btnBosluk = butonlar.get(tiklananKonum - 1);
   if (btnBosluk.getText().equals(""))
    boslukKonum = (tiklananKonum - 1);
   
  }
  
  //4)Bir Sonraki Konuma Bakmak: 
  if ( ((tiklananKonum + 1 ) < butonlar.size()) && (((tiklananKonum - (bulunduguSatir * sutunSayisi) + 1) != sutunSayisi)) ){
   
   btnBosluk = butonlar.get(tiklananKonum + 1);
   if (btnBosluk.getText().equals(""))
    boslukKonum = (tiklananKonum + 1);
  }
  
  //Toast.makeText(context,"Burada : " + Integer.toString(index),Toast.LENGTH_SHORT).show();
  
  //Yer değiştir
  if (boslukKonum != -1)
   Collections.swap(butonlar, tiklananKonum, boslukKonum);

  //GridView'i refresh et
  gridView.setAdapter(sayilarAdapter);
  
 }
 
 private void kontrolEt(){
  
  //1 eksigi(bosluk butonu haric) kadar dön
  for (int n = 0; n < butonlar.size() - 1; n++){
   
   Button button = butonlar.get(n);
   //Arada bosluk varsa cik
   if (button.getText().equals("")) return;
   
   //Sayialar dogru siralanmamissa cik.
   if ( n != (Integer.parseInt( button.getText().toString() ) - 1) )
    return;
   
  }
  
  timer.cancel();//sayaci durdur
  
  //Bilgi penceresi
  AlertDialog alertDialog;
  alertDialog = new AlertDialog.Builder(this).create();
  alertDialog.setTitle("Tebrikler");
  Date simdikiZaman = new Date();   
  long fark = simdikiZaman.getTime() - baslamaVakti.getTime();
  simdikiZaman.setTime(fark);
  SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
  alertDialog.setMessage(sdf.format(simdikiZaman) + " sürede bitti");
  alertDialog.show();

  //finish();

 }
    
    public class SayilarAdapter extends BaseAdapter {
     
     @Override
  public int getCount() {
   return butonlar.size();
  }

  @Override
  public Object getItem(int arg0) {
   return butonlar.get(arg0);
  }

  @Override
  public long getItemId(int arg0) {
   return arg0;
  }

  @Override
  public View getView(int position, View viewButton, ViewGroup viewGroup) {
   
   if (viewButton != null) 
    return (Button) viewButton;

   return butonlar.get(position);
   
  }
     
    }
}

12 Aralık 2011 Pazartesi

(Sayı Sırala - 3) MainActivity

Bu uygulamayı indir

Proje oluşturulduğunda src/com.ornekler.sayisirala/ yolunun altında MainActivity.java yani  MainActivity oluşturulduğunu da göreceksiniz. Bu activity’i ana ekran için kullanacağız. Kullanıcı bu ekranda zorluk derecesiniz belirleyebilecek.

Şimdi bu activity kullandığı layout’un tasarımını yapmalıyız. res/layout altındaki main.xml layout’u şu şekilde tasarlıyoruz.

main.xml
Ekrandaki bileşenlerin text özelliğine istediğinizi yazabilirsiniz. Fakat string.xml dosyasını kullanmayı düşünüyorsanız bileşenin üzerinde sağ tıklayıp “Edit Text” komutunu vererek direk string.xml dosyasına yeni satır girebilir ve bu satırın(text değerin) bileşenin text özelliğine atayabilirsiniz.

MainActivity içerisinde özelleştirilmiş dialog kutusu da kullanacağımız için birde dlg_ozel.xml adında yeni bir layout daha oluşturuyoruz.
Res/layout dizini üzerinde sağ tıklayıp New>Other… a tıklayıp Android/Android XML Layout File komutunu verip ileri tıklayalım. File kutusuna “dlg_ozel” yazıp layout oluşturalım. Aşağıdaki gibi bir tasarım yapıyorum.

dlg_ozel.xml

Layoyut tasarımının ardında MainActivity.java yı kodlamaya başlayabiliriz.

MainActivity.java

package com.ornekler.sayisirala;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        this.setTitle("Sayı Sırala - Seviye Seç");
        
        Button btnBasit = (Button) this.findViewById(R.id.btnBasit);
        Button btnOrta = (Button) this.findViewById(R.id.btnOrta);
        Button btnOzel = (Button) this.findViewById(R.id.btnOzel);
        
        Typeface font = Typeface.createFromAsset(getAssets(), "font/Corv2.ttf");
        btnBasit.setTypeface(font);
        btnBasit.setTextSize(36.f);
        
        btnOrta.setTypeface(font);
        btnOrta.setTextSize(36.f);
        
        btnOzel.setTypeface(font);
        btnOzel.setTextSize(36.f);
       
        btnBasit.setOnClickListener( new OnClickListener(){
         
   @Override
   public void onClick(View v) {
    Intent i = new Intent(getApplicationContext(), OyunActivity.class);
    i.putExtra("sutunSayisi", 3);
    i.putExtra("satirSayisi", 2);
    startActivity(i);
    
   }
        });
        
        btnOrta.setOnClickListener( new OnClickListener(){
         
   @Override
   public void onClick(View v) {
    Intent i = new Intent(getApplicationContext(), OyunActivity.class);
    i.putExtra("sutunSayisi", 3);
    i.putExtra("satirSayisi", 3);
    startActivity(i);
    
   }
        });
        
        btnOzel.setOnClickListener( new OnClickListener(){
         
   @Override
   public void onClick(View v) {
    
    AlertDialog.Builder builder;
    AlertDialog alertDialog;
    
             LayoutInflater factory = LayoutInflater.from(v.getContext());
             final View textEntryView = factory.inflate(R.layout.dlg_ozel, null);

    builder = new AlertDialog.Builder(v.getContext());
    builder.setView(textEntryView);
    builder.setTitle("Özel Ayarlar");
    builder.setMessage("Sütun ve satır sayısını gir");
  
    builder.setPositiveButton("Oyna", new DialogInterface.OnClickListener() {
     
     @Override
     public void onClick(DialogInterface dialog, int which) {
      
      EditText editTextSutunSayisi = (EditText) textEntryView.findViewById(R.id.editTextSutunSayisi);
      EditText editTextSatirSayisi = (EditText) textEntryView.findViewById(R.id.editTextSatirSayisi);
      
      Intent i = new Intent(getApplicationContext(), OyunActivity.class);
      i.putExtra("sutunSayisi", Integer.parseInt(editTextSutunSayisi.getText().toString()));
      i.putExtra("satirSayisi", Integer.parseInt(editTextSatirSayisi.getText().toString()));
      startActivity(i);

     }
    });
    
    builder.setNegativeButton("İptal", new DialogInterface.OnClickListener() {
     
     @Override
     public void onClick(DialogInterface dialog, int which) {
      dialog.cancel();
     }
    });
    
    alertDialog = builder.create();
    alertDialog.show();

   }
        });
        
    }
    
}

11 Aralık 2011 Pazar

(Sayı Sırala - 2) Proje Oluşturma

Bu uygulamayı indir

New menüsünden Android Project komutunu veriyoruz.
  1. Create Android Project kısmında Project Name  “SayiSirala” yaziyorum. 
  2. Select Build Target kısmındaki listeden Android 2.1(API Level 7) seçiyorum.
  3. Application Info kısmında ise Application Name kutusuna SayiSirala, Package Name’e “com.ornekler.sayisirala”, Create Activity kutusunada “MainActivity” yazıyorum.
Finish komutunu verip uygulamayı oluşturun.

10 Aralık 2011 Cumartesi

(Sayı Sırala - 1) Hazırlık


Uygulamanın bitmiş halinin görüntüsü
Bu uygulamayı indir

İlk örnek projemiz basit bir sayı sıralama oyunu olsun. Öncelikle uygulamanın küçük bir algoritmasını çıkaralım.

Seviye Seçimi (Ana Ekran)
Oyuncu basit(3x2), orta(3x3) ya da özel bir zorluk derecesi seçebilmeli. Özel seçildiğinde oyuncudan sütün ve satır sayısın girilmesi istenmeli ve bu değerlere göre oyun tahtası hazırlanmalı.

Zamanla Yarışma:
Oyuncunun oyunu ne kadar zamanda bitirdiğini gösterebilmek için bir timer nesnesi ile oyunda geçirilen süre hesaplanmalı.

Oyun Tahtasının Hazırlanması:
Bu uygulamada oyun tahtası olarak GridView, sayılar içinde Buton elemanlarını kullanacağız... Her yeni oyunda sayılar yani butonlar rastgele sıralanmalı.

Sayı Adedinin Tespiti:
Belirtilen satır ve sütün sayısının çarpımının bir eksiği kadar sayımız olacak. Neden bir eksiği çünkü arada sayıları hareket ettirebilmek için bir boşluğa ihtiyacımız olacak.

Yani 3x2 lik bir tahta için sayı sayısı 3 x 2 - 1 = 5 olmalı. Yani şu şekilde



Sayı Hareketleri:
Boşluk hariç kaç tane sayımızın olacağını belirledik, şimdide bu sayıların nasıl hareket edeceğini belirleyelim.

Not: 1.sayının konumu yani indeksi 0’dır. 2. sayının konumu 1’dir… n. sayının konumu n-1’dir.

1) Sayının üstüne bakmak :


Burada 4 sayısına tıkladığımızı varsayarsak, 4’ün üstüdeki sayının konumunu bulmak için söyle bir formül kullanabiliriz.

Tıklanan Sayının Konumu – Sütün Sayısı = Tıklanan Sayının Üstündeki Elemanın Konumu

Yani
4 sayısının konumu 4 tür. Sütün sayısı = 3 ise

4 - 3 = 1 o halde 4 sayısının üstündeki sayının konumu yani indeksi 1'dir. O zaman 1. konumdaki elemanı kontrol edeceğiz. Eğer orada bir sayı yoksa 4 sayısını oraya taşıyacağız aksi halde hiçbir şey yapmayacağız.


Tabii sınır dışına çıkmamak için tüm bunları bir if bloğu içerinde yapmalıyız. if bloğunun koşulu ise şöyle olmalı:

(Üsteki Sayının Konumu – Sütün Sayısı) >= 0

 ise bu işlemler yapılmalı. Yani 1 sayısına tıklandığını düşünün 1- 3 = -2 olup uygulamanın -2. indeksteki sayıya bakmasına yani dizi sınırının dışına çıkmasına ve hata vermesine sebep olur.

Kod olarak yazalım

//1) Sayının üstüne bakmak 
if ( ((tiklananKonum - sutunSayisi) >= 0) ) {
   
 btnBosluk = butonlar.get(tiklananKonum - sutunSayisi);
 if (btnBosluk.getText().equals(""))
 boslukKonum = (tiklananKonum - sutunSayisi);

}

2) Sayının altına bakmak :



Burada 2 sayısına tıkladığımızı varsayarsak, 2’ün altındaki elemanın konumunu bulmak için söyle bir formül kullanabiliriz.

(Tıklanan Sayının konumu + Sütün Sayısı) = Tıklanan Sayının Altındaki Elemanın Konumu

Yani 2 sayısının konumu 2 dir. Sütün sayısı = 3 ise 2+3=5 o halde 2 sayısının altındaki elemanın konumu yani indeksi 5 dir. O zaman 5. sıradaki sayıyı kontrol edeceğiz. Eğer orada bir sayı yoksa 2 sayısını oraya taşıyacağız aksi halde hiçbir şey yapmayacağız.

Yine sınır dışına çıkmamak için tüm bunları bir if bloğu içerinde yapmalıyız. if bloğunun koşulu ise şöyle olmalı.

(Alttaki Sayının Konumu + Sütün Sayısı) < Sayı Sayısı

ise bu işlemler yapılmalı. Yani 5 sayısına tıklandığını düşünün 5 + 3 = 8 olup uygulamanın 8. indeksteki sayıya bakmasına yani dizi sınırının dışına çıkmasına ve hata vermesine sebep olur. Çünkü
toplam sayı sayısı boşlukla beraber 6'dır.

Kod olarak yazalım

//2)Sayının altına bakmak:
if ( (tiklananKonum + sutunSayisi) < butonlar.size()) {
   
 btnBosluk = butonlar.get(tiklananKonum + sutunSayisi);
 if (btnBosluk.getText().equals(""))
  boslukKonum = (tiklananKonum + sutunSayisi);
}

3) Bir Önceki Konuma Bakmak:



Burada 4 sayısına tıkladığını düşünürsek bir önceki konumu bulmak için şu formülü kullanabiliriz.

(Tıklana Sayının Konumu – 1) = Bir Önceki(Soldaki) Elemanın Konumu

Yani
2 – 1 = 1
demek ki 1. konumdaki elemanı kontrol edeceğiz. Eğer boşluk ise 4 sayısını sola hareket ettireceğiz aksi halde hiçbir şey yapmayacağız.


Sınır dışına çıkmamak için ve tıklanan sayısının ikinci satırın başında olup ta birinci satırın sonundaki boşluğa atlamasını engellemek için yukarıdaki formülü iki koşullu bir if bloğu içerisine almalıyız.
 A - Sınır dışına çıkmamak için if bloğunun ilk koşulu şöyle olmalı : 1 sayısına tıklandığını düşünün formülü uygularsak 0-1 = -1 uygulama -1. konumdaki elemana bakacak yani dizinin sınırının dışına çıkılmış olacak. Bunu engellemek için koşulumuz şöyle olmalı:

(Tıklana Sayının Konumu – 1) >= 0

B - Tıklanan sayısının ikinci satırın başında olup ta birinci satırın sonundaki boşluğa atlamasını engellememiz gerek. (Aşağıdaki resme bak)


3 sayısına tıklandığını düşünün, formülü uygulayalım 3-1 = 2 yani 2 konumdaki elemana bakacağız evet orada boşluk var o zaman 3 sayısı oraya taşınacak. Ama bu bir hatadır. İşte bu hatayı engellemek içinde diğer koşulumuzda şöyle olmalı.

(Tıklana Sayının Konumu - Tıklana Sayının Bulunduğu Satır X Sütun Sayısı) != 0

[ (3 – 1 X 3) != 0 ] = False

İşlem sonucu sıfırdır. Koşul uymaz ve taşıma işlemi gerçekleşmez. Yani burada herhangi bir satırın en başındaki sayısının bir üstteki satırın sonundaki boşluğa taşınmasını engelledik.

Not: Birinci satırın indeksi 0, ikinci satırın indeksi 1, …n. satırın indeksi n-1’dir.

Kod olarak yazalım


//3) Bir Önceki Konuma Bakmak:

if ((tiklananKonum - 1 ) >= 0 && ((tiklananKonum - bulunduguSatir * sutunSayisi) != 0) ){ 

 btnBosluk = butonlar.get(tiklananKonum - 1);
 if (btnBosluk.getText().equals(""))
  boslukKonum = (tiklananKonum - 1); 

}

3) Bir Sonraki Konuma Bakmak:

Burada 3 sayısına tıkladığını düşünürsek bir sonraki konumu bulmak için şu formülü kullanabiliriz.

(Tıklana Sayının Konumu + 1) = Bir Sonraki(Sağdaki) Elemanın Konumu

Yani 3 + 1 = 4 demek ki 4. konumdaki elemanı kontrol edeceğiz. Eğer boşluk ise 3 sayısını sağa hareket ettireceğiz aksi halde hiçbir şey yapmayacağız.

Sınır dışına çıkmamak ve tıklanan sayısının birinci satırın sonunda olup ta ikinci satırın başındaki boşluğa atlamasını engellemek için yukarıdaki formülü iki koşullu bir if bloğu içerisine almalıyız.
 A - Sınır dışına çıkmamak için if bloğunun ilk koşulu şöyle olmalı : 2 sayısına tıklandığını düşünün formülü uygularsak 5+1 = 6 uygulama 6. konumdaki elemana bakacak yani dizi dışına çıkılmış olacak. Çünkü en son elemanın indeksi 5’dir ve dizi dışına çıkılmıştır. Bunu engellemek koşulumuz şöyle olmalı:

(Tıklana Sayının Konumu + 1) < Sayı Sayısı

B - Tıklanan sayısının birinci satırın sonunda olup ta ikinci satırın başındaki boşluğa atlamasını engellememiz gerek. (Aşağıdaki resme bak)


4 sayısına tıklandığını düşünün, formülü uygulayalım 2+1 = 3 yani 3. konumdaki elemana bakacağız evet orada boşluk var o zaman 4 sayısı oraya taşınacak. Ama bu bir hatadır. İşte bu hatayı engellemek içinde diğer koşulumuzda şöyle olmalı.

(Tıklana Sayının Konumu – (Tıklana Sayının Bulunduğu Satır X Sütun Sayısı) + 1 ) != Sütun Sayısı

[ (2 – (0 X 3) + 1) != 3 ] = False


İşlem sonucu 3’dür. Koşul uymaz ve taşıma işlemi gerçekleşmez. Yani burada herhangi bir satırın en sonundaki sayısının bir alttaki satırın başındaki boşluğa taşınmasını engelledik.

Not: Birinci satırın indeksi 0, ikinci satırın indeksi 1, …n. satırın indeksi n-1’dir.

Kod olarak yazalım
//4)Bir Sonraki Konuma Bakmak:

if ( ((tiklananKonum + 1 ) < butonlar.size()) && (((tiklananKonum - (bulunduguSatir * sutunSayisi) + 1) != sutunSayisi)) ){

 btnBosluk = butonlar.get(tiklananKonum + 1);
 if (btnBosluk.getText().equals(""))
  boslukKonum = (tiklananKonum + 1);

}

Her Sayı Hareketinde Kontrol
Oyuncunun her sayı hareketinden sonra sayılar doğru bir şekilde sıralanmış mı kontrol edilir. Sıralama doğru ise timer nesnesi durdurulup oyuncuya oyunun ne kadar zamanda bitirildiği söylenip oyun sonlandırılır.

24 Kasım 2011 Perşembe

Proje Oluşturma

File > New  > Android Project komutunu vererek yeni bir proje oluşturun.


Proje adı olarak Proje1 yazıp sonraki adıma geçiyorum.


Android 2.1 projesi oluşturacağım için Android 2.1 API seçiyorum. Sonraki adım


Package Name kısmınada androidprogramcisi.projeler yazıp Finish ile işlemi sonlandırıyorum.

Proje oluşturuldu Run komutu vererek uygulamayı çalıştıralım. Ekrana Run As penceresi gelecek


Android Application seçip OK tıklayın. IDE emulatoru çalıştırıp uygulamayı upload edip çalıştıracak.


Size tavsiyem emulatoru kapatmadan kodlamaya devam etmek çünkü uygulamada bir değişiklik yaptıktan sonra Run komutunu verdiğinizde emulator önceki uygulamayı kapatıp upload edilen yeni uygulamayı çalıştıracaktır. Böylece her seferinde emülatorun tekrar tekrar kapatılıp açılmasından kaynaklanan zaman kaybını önlemiş olursunuz.

Proje Dizin Yapısı 



src : Kaynak kodların bulunduğu dizin.
gen(generated) : IDE tarafından oluşturulan dosyaların bulunduğu dizin. Burada R.java dosyasının üzerinde biraz durmamız lazım.
R.java, projedeki(res dizinindeki) tüm resim, metin ve bileşenlerin adreslerini tutan bir veritabanıdır diyebiliriz. Örneğin
public static final int ic_launcher=0x7f020000;
satırındaki ic_launcher değişkeni res dizinindeki ic_launcher.png dosyasına işaret eder. Aynı şekilde app_name değişkenide string.xml dosyasındaki app_name(Proje1) değerini işaret eder.

Android 2.1 : Kütüphanelerin bulunduğu dizin.
assets : res dizininden farklı olarak çalışma zamanında kullanacağımız dosyaların bulunduğu/bulunacağı dizindir.
bin : Uygulama derlendiğin oluşan binary dosyalarının bulunduğu dizin.
res(resource) : Projedeki kaynakların yani resim, metin ve görünümlerin tutulduğu dizin.
  • drawable-hdpi(240 dpi) / ldpi(120 dpi) / mdpi(160 dpi) : Farklı ekran tiplerine göre ayrı ayrı hazırladığımız resim dosyalarının tutulduğu dizinlerdir. Örneğin 240dpi yani hdpi ekran için oluşturacağımız ic_launcher dosyasının boyutları 72x72 piksel iken 120dpi yani ldpi ekran için oluşturacağımız ic_launcher dosyasının boyutu 36x36pikseldir.
  • layout : Arayüzlerin bulunduğu dizin.
  • values : Projedeki string ifadelerin tanımlandığı xml dosyaları tutulur.

    txtView1.setText(R.string.app_name);


    satırı txtView1 bileşeninin text özelliğine strings.xml dosyasında tanımlı app_name yani "Proje1" değerini yazar. İsterseniz

     txtView1.setText("Proje1");

    şeklinde de kodlama yapabilirsiniz ama yerelleştirme için bu yapıları kullanmak yararınıza olacaktır.
AndroidManifest.xml : Projenin konfigürasyon dosyasıdır. Yeni aktivite ekleme, servis tanımları ve uygulamaya verilecek haklar gibi birçok önemli tanımlamalar bu dosya ile yapılır.

23 Kasım 2011 Çarşamba

Sanal ve Gerçek Aygıtlarla Çalışma

Uygulamaların Sanal Aygıt Üzerinde Çalıştırılması:
Android yüklü cihazımız olmadan da uygulama geliştirebiliriz bunun için sanal aygıt(telefon, tablet, vs…) tanımlamamız gereklidir.
Başlat/Programlar/Android SDK Tools/AVD Manager 
ya da
Eclipse araç çubugunda bulunan Android Virtual Device Manager butonuna tıklayın.


Sanal makine oluştururken dikkat etmemiz gereken birkaç nokta var. Oluşturacağınız projelerin API sürümü oluşturduğunuz sanal aygıtların API sürümüne küçük ya da eşit olmalı.

Projenin API sürümü <= Aygıtın API sürümü(Target)

Burada oluşturduğum sanal aygıtın sürümü Android  2.1 oluşturacağım proje ise Android 1.5 projesi ise

[ 1.5(Proje) <= 2.1(Aygıt) ] = Doğru


Bu durumda IDE uygulamayı sanal aygıt üzerinde çalıştıracaktır. Aksi halde hata alırsınız.

Bana kalırsa her bir major numara(MajorNo.X.X) için bir aygıt oluşturmak en iyisidir. Yani;

Andorid 2.1,
Andorid 2.2,
Andorid 2.3
projeleri için oluşturacağım sanal aygıtın API sürümü Andorid 2.3 olacaktır. Ben bu şekilde çalışıyorum tabii siz her sürüm için ayrı ayrı sanal aygıt tanımlayabilirsiniz. IDE ise projenin sürümüne göre en uygun sanal aygıtı otomatik seçecektir.

Create AVD diyip pencereyi kapatın. Aygıt listede yerini alacak isterseniz Start basıp test edebilirsiniz.

Uygulamaların Gerçek Bir Cihaz Üzerinde Çalıştırılması:
PC bağlı bir Android cihazınız varsa IDE yukarıdaki kriterleri de göz önünde bulundurarak ve önceliği gerçek cihaza vererek uygulamayı direk cihaza upload edip çalıştıracaktır.