FİREBASE

Firebase, android uygulamamızı oluşturmamıza yardımcı olan, google’ın ürettiği bulut tabanlı bir yapıda olup, android uygulama geliştirme platformudur.

Günümüzde uygulamalar platform farketmeksizin aynı veriye her cihazdan erişmek istiyor. Uygulaması bir çok kullanıcı tarafından yüklenen geliştiricilerin de kayıt-oturum bilgilerini tutma,uygulamaların kullanım verilerini analiz etme , aynı zamanda kullanıcıya bildirimler gönderme gibi işlemleri rahatlıkla yapabileceği bir protokol gerekiyor. İşte Firebase bütün bu ihtiyaçları karşılayabilmek için uygulamala geliştiricilerine ücretsiz kullanım sunan , bizi bu protokollerden kurtarıyor.

Firebase’nin avantajları,

Google tabanlı olması bize güvenli bir sunucu vermesi yani sunucunun çökme durumu yok denecek kadar az; Bulut tabanlı veri yapısı ile google tarafından güvenliği sağlanıyor. Ücretsiz olması ,maliyet açısından hesaplı. Yazılım geliştirme süresini azaltır. Ve her platformda sorunsuz çalışır.

Şimdi Firebase’ı android uygulamamıza nasıl ekleriz ? Bunu anlatacağım.

2 yönetimi var. Birincisi, google hesabı açmamız gerekiyor. Firebase sitesinden konsola git sonra yeni proje oluştura tıklıyoruz.3 platform çıkıyor karşımıza, android uygulaması için androidi seçiyoruz.

Bizden paket adı istiyor.Paket adını MainActivity’nin üst kısmında yada Manifest dosyasısının içinde bulabiliriz . Uygulama ekleye tıklıyoruz. Daha sonra bize adım adım sdk kurulumunu gösteriyor. Bir dosya iniyor ,dosyayı android studionun proje kısmındaki app dosyasının içine ekliyoruz.adımları uygulayıp projemizi android uygulamamıza bağlamış oluyoruz. Diğer bir adım , birinci yöntemden daha kolay , Android Studioda tools kısmında Firebaseyı tıklıyoruz. Yan tarafa geliyor zaten . Gerçek zamanlı Database(Realtime Database)’i seçiyoruz. Sonra connet yapıp tek tek uygulamamıza kendisi bir önceki yaptığımız adımları ,o indirilen dosyayı ekliyor.

Şimdi basit kodlamamızı yapalım;

Kodlama yapmadan önce, Firebese de kurallar kısmında true yapmamız lazım.Kaydetmeyle ilgili farklı sürümlerde farklıdır. O yüzden buraya okuma yazma iznini verip yayınla diyoruz.

Tanımlamalarımız:

FirebaseDatabase database;
DatabaseReference mRef;
String gelenVeri;
TextView tv;

  database = FirebaseDatabase.getInstance();
        mRef = database.getReference("isim");
        tv = (TextView) findViewById(R.id.textview);

        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mRef.setValue("Emine");
            }
        });

Bir örnek nesne oluşturduk ve tanımladık. 2 tane metotumuz var.Otomatik olarak veriyi çekiyor.


       mRef.addValueEventListener(new ValueEventListener() {
           @Override
           public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
             String gelenVeri= dataSnapshot.getValue(String.class);
             tv.setText(gelenVeri);

           }

           @Override
           public void onCancelled(@NonNull DatabaseError databaseError) {

           }
       });

    }
}

Android ListView Kullanımı

Merhaba,bu yazımda Android Listview nasıl kullanılır ondan bahsedeceğim.

Android Listview, kaydırılabilir bir listede bulunan görsel öğe alan öğeler grubu içeren görünümdür.

Listview sayesinde biz öğelerimizi ekranda sıralı biçimde yani liste şeklinde gösterebiliriz.

Şimdi kısa bir kodlama ile anlatmaya çalışacağım. Öncelikle projemizin xml kısmından ekrana listView ekleyelim.Aşağıda görründüğü gibi düz bir şekilde yazacak verilerimizi.

Şimdi MainActivity kısmından java kodlamamızı yapalım. ListViewi tanımlayalım.

 ListView liste;

Bu tanımlamayı java kısmından çağıracağız. ListViewi daha önce butona textViewe yaptığımız gibi id’sini bulup çağırıyoruz.

liste=(ListView)findViewById(R.id.listview);

Dizinin her elemanı bizim listemizin bir satırını oluştursun.

final  String [] sehirler={"Kayseri","Erzurum","İstanbul","Mersin"};

ListView, içeriği veri kaynağından (string array, array, database vb.) ListView’e ekleyen Adapter sınıflarını kullanır.

Bu elemanları string dizisini göstrebilmek için,bir adaptör tanımlamamız gerekiyor. Adaptör ile liste arasında bir köprü oluşuyor.

 ArrayAdapter <String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,
                android.R.id.text1,sehirler);

        liste.setAdapter(adapter);

1.parametre this, 2.parametre listViewin görüntüsü, 3.parametre ListViewin yazı stili, 4.parametre bizim yazdığımız şehirler.

Adaptör ile listeyi birbirine bağlamak için;

  liste.setAdapter(adapter);

Programı çalıştırdığımızda listemizin düzenli bir şekilde görünümünü elde ettik.

Peki bu şehirlere tıkladığımızda içindeki verilere nasıl ulaşırız ? Aynı butona tıkladığımızda dinleme olayını yaptığımız şekilde listeye Clik olayını ekliyoruz. Fakat butonun kinden farklı olarak ItemClickListener olmasıdır.

 liste.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(MainActivity.this,sehirler[position]+" sectiniz",Toast.LENGTH_SHORT).show();
            }
        });
    }
}

Android Studio’da Dosyadan Okuma Ve Yazma İşlemleri

Merhaba ben bu yazımda Android Studio’da dosya nasıl yazılır dosyadaki içerik nasıl okunur ondan bahsedeceğim . Öncelikle yeni bir activity açalım. Bir dosya açıp, dosyanın içine bir bilgi yazacağız. Dosyayı okuma moduna alıp dosyanın içindeki bilgiyi ekrana yazdıracağız.

Şimdi bir textView ,bir tane de buton ekleyelim. Xml’den text kısımlarını ve Id’lerını düzenleyelim.

android:hint=”Dosyanın içeriği”
android:text=”Kaydet”

En önemli kısmı Manifest izni vermemiz gerekiyor.

Sağ tarafta app’nin altında manifest yeri var. Orayı açıp aşağıdaki kodu yazmamız gerekiyor.

<uses_permission android:name= "android.permission.WRITE_EXTERNAL_STORAGE"> </uses_permission> 

Bilgisayarımızdan text dosyası açalım.

Resource’nin altında new sonra directör diye bir kendi oluşturduğumuz text dosyasını koycağız. raw yazalım. Şimdi bu dosyayı kendi android dosyamızdann resourcenin içine nasıl ekleyeceğiz?

Sağ tıklayıp, Directory Path’ı tıkadığımızda show ın explorer ile dosyalarımız görünüyor. Raw dosyayı şuan boş .Kendi oluşturduğumuz txt. dosyasını oaraya atıyoruz.

Şimdi MainActivity kısmından kodlamamızı yapalım. Tanımlamalardan başlayalım.

EditText dosya_içerik ;
    FileInputStream fileInputStream;
    FileOutputStream fileOutputStream;

Try ve catch kullanacağız. Çünkü dosya bulanamadı diye hata veriyor. Dosyaya yazmak için ;

dosya_içerik = (EditText) findViewById(R.id.editText_İçerik);
        final TextView tv = (TextView) findViewById(R.id.textView);
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                try {
                    outputStream = openFileOutput("blogyazısı.txt.txt", MODE_APPEND);
                } catch (Exception e) {
                    System.out.print(e);
                }
                try {
                    outputStream.write(tv.getText().toString().getBytes());
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

Okumak için input kullanıyoruz.

findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
      @Override
         public void onClick(View v) { 
           int a=65;
           tv.setText(Character.toString((char)a));
           try {
                ınputStream= openFileInput("blogyazısı.txt");
           }catch(Exception e){
           e.printStackTrace();
}
         int x;
         String okunan_metin="";
         try{
              while((x=ınputStream.read())!=-1) {
              okunan_metin += Character.toString((char) x); }
                ınputStream.close();
        }catch(IOException e){
   }
       tv.setText(okunan_metin);      Toast.makeText(MainActivity.this,okunan_metin,Toast.LENGTH_SHORT).show();
            }
   }
        );
    }
}

TİMER NEDİR?

Timerler, arka planda çalışan belirli aralıklarda tekrarlanmasını istediğimiz olaylara yön vermemizi ve bunları yönetmemizi sağlayan yapılardır. Yani belirli aralıklarda bir kodun çalışmasını istiyorsak .Bu yapıları kullanırız.
Timer belirlenen işlemi yada işlemleri, belirlenen zaman aralıklarıyla çalıştırmamıza olanak sağlar.  Timerlar ile handler aynı görevi yaparlar.

Timer nesnesinin tanımlanması aşağıdaki şekildedir;

timer t;

Timer classı oluşturma;

 class timer extends CountDownTimer {
        public timer(long millisInFuture, long countDownInterval) { super(millisInFuture, countDownInterval); }
        @Override
        public void onTick(long millisUntilFinished) {
        }

        @Override
        public void onFinish() {
        }  }

Classımızda iki tane metotudumuz olması gerekiyor. onTick() metodunda neler yapacağımızı söylüyoruz.

Timer nesnemizin kullanımı da şu şekildedir;

t=new timer(10000,10);

Neden 2 parametre aldık ? Çünkü ne kadar sürede ve hangi sürede artacağını parametrede belirttik. Mesela her saniyede 2 artmış oldu.

Şimdi en basitinden bir tane sayaç yapalım. Bir buton ekleyelim.Butonumuz hareket edecek öncelikle.


public class MainActivity extends AppCompatActivity {
    Button button;
    timer t;
    int i;

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

         button=(Button)findViewById(R.id.button);
        t = new timer(10000, 5);
         i=0;
         t.start();

    }
    class timer extends CountDownTimer {
        public timer(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }

       @Override
       public void onTick(long millisUntilFinishe){
            button.setY(button.getY()-1);
       }
        public void onFinish() {

        }

    }
}
Butonumuz ortadan başlayaıp aşağıdan yukarı doğru hareket ederek sürüklenecek.
Bu şekilde yukarı doğru çıkmış olacak.

Butonun konumunu ;

public void onTick(long millisUntilFinishe){
button.setY(button.getY()-1);
}

Button bu metot sayesinde hareket ediyor. getY()üstünü referans alır.

Şimdi iki tane buton ekleyelim . 1.si sabit dursun. 2.de aşağı doğru hareket edip üst üste geldiğinde dursun.

 timer t;
    int i;

    Button button;
    Button button2;

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

         button=(Button)findViewById(R.id.button);
         button2=(Button)findViewById(R.id.button2);
         t = new timer(10000, 10);
         i=0;
         t.start();
         
    }
    class timer extends CountDownTimer {
        public timer(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }

           @Override
           public void onTick(long millisUntilFinished){
            if (button.getY()+button.getHeight()<button2.getY()){
                t.cancel();
            }
            else{
                button.setY(button.getY()-2);
            }

       }

Butonun birisi sabit kalırken diğeri aynı hizaya geldiğinde duracak.

Şimdi bir başlat butonuna tıkladğımızda geri sayım sayacı başlayacak ve bir textview alanına kalan süreyi yazacak.


public class MainActivity extends AppCompatActivity {
   Button button;

   timer t;
   int hiz;
   TextView label_hiz;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        hiz=2;
        button=(Button)findViewById(R.id.button);

        t=new timer(10000,10);
        label_hiz=(TextView)findViewById(R.id.label_hiz);
        Button btnHiz =(Button)findViewById(R.id.button3);
        btnHiz.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                hiz+=5;
                label_hiz.setText(String.valueOf(hiz));
            }
        });

    }

    class timer extends CountDownTimer {
        public timer(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }

        @Override
        public void onTick(long millisUntilFinished) {

            button.setY(button.getY()+hiz);

        }

FRAGMENT NEDİR?

Android kullanıcı arayüzlerinden Activity’leri biliyoruz. API level+11 den sonra Android geliştiricilerine sunulan Fragmentlar bir Activity içerisinde çalışan bir kullanıcı interface’ini temsil eden küçük Activity parçaları olarak tanımlanabilir. Yani Fragment’ler Activityler gibi kullanıcı arayüzlerini oluşturular.

NEDEN ACTİVİTY VARKEN FRAGMENTLAR?

Fragmentlar, Activity sınıflarına göre daha performanslı ve daha kullanışlıdırlar. Bir Activity içerisinde istediğimiz kadar Fragment yaratabiliriz ya da başka bir activity içerisinde aynı Fragment’ı tekrar kullanabiliriz, istediğimiz yerde çağırabiliriz. Yani, temel amaç performansın artırılmasıdır.Dolayısıyla   kullanıcılara esnek bir yapı sunmaktadırlar.Fragmentlar aynı Activityler gibi gibi bir class  ve birr layout dosyasından oluşurlar. Aynı ekranda iki farklı Activity çalışamazken iki veya daha fazla farklı fragment çalışabilmektedir. Fakat bir Fragment Activity gibi kendi başına direkt olarak çalıştırılmaz. Fragment bir Activity içerisinde çalıştırılması gerekmektedir. Yani uygulamada bir Activity sınıfı olmalı, tasarlanan tüm görseller (Fragment’lar) bu Activity sınıf olmalı, tasarlanan tüm görseller (Fragmentlar) bu Activity sınıfı içinde yer değiştirme işlemi ile gösterilmelidir.

Bir Fragment değiştirildiğinde veya ön plana başka bir uygulama açıldığında önce Fragment’ın onPause () tuşu çağırılır. Bir Fragment bir Activitye eklendiğinde sırayla onAttach(), onCreate() , onCreateView() ,onViewCreated(),onStart(), onResume() metotları çağırılır.  Fragment kapanır veya değiştirilirse onStop(), onDestory() onDetach() metotları çağırılır.

}
    @Override
    protected void onStart(){
        super.onStart();
        Log.d("mesaj","start");
    }
    @Override
    protected void onStop(){
        super.onStop();
        Log.d("mesaj","Stop");
    }
    @Override
    protected  void onDestroy(){
        super.onDestroy();
          Log.d ("mesaj","Destory");
    }
    @Override
    protected void onPause(){
        super.onPause();
        Log.d ("mesaj","pause");
    }


    @Override
    protected void onResume(){
        super.onResume();
        Log.d ("mesaj","Resume");
    }
}


Ekranı döndürdüğümüzde ise;

ANDROİD STUDİO ‘DA OPTİONS MENÜ VE CONTEXT MENÜ OLUŞTURMA

Menü, uygulamanın gerekli ayarları, kullanıcıya seçimler yapma olanağı veren, uygulamadan çıkış gibi görevlerin genel olarak yapıldığı bileşenlere menü çubukları denir. Android uygulamalarda menülerin önemi çok büyüktür. Çünkü bazı uygulamalarda geliştirici, diğer uygulamalarını tanıtmak için uygulamalar diye bir sekme ekler menülere. Hemen hemen çoğu uygulamada hakkında sekmesi vardır. Buda geliştirici hakkında bilgi içerir dolayısıyla önemlidir bizim için. Bu yazımda Android için menüleri ve kısaca nasıl oluşturulduklarından bahsedeceğim.

Öncelikle Android ‘de 2 tip menü vardır.

1-) Options Menü

2-) Context Menü

Options Menü bir Activitye bağlı yani bir Activitiye veriyoruz. Şimdi kodlamayla bunu göstereyim. İlk önce xml ile menüyü kodlamamız gerekiyor. Daha sonra java ile uygulamamıza menü nesnesi ekleyeceğiz.

 Android Studionun sol tarafında res var. Üstüne gelince sağ tıklayıp  new → Android resource directory → Buradan isim vereceğiz. Menü diyelim. Resin altına menü klasörü gelecek. Oradan tekrar sağ tıklarıp new → resource file→  menü1  diyelim.

Şimdi menü1.xml dosyamızın kodlamasını yapalım.

 Menü ile yeni menü oluşturuyoruz. İtem ile menüye yeni nesne ekliyoruz. İd parametresinin nesnenin kimliği olarak kullanılır title  parametresi nesnenin başlığını belirlememizi sağlıyor.

Bu adımdan sonra yapmamız gereken şey oluşturduğumuz menüyü javayı kullanarak uygulamamıza eklemek.

public boolean onCreateOptionsMenu(Menu menu) {
      
        return super.onCreateOptionsMenu(menu);
    }

Classımız burada parametre alıyor.

getMenuInflater().inflate(R.menu.menu1,menu);

Bu metodla paframetreye bağlıyoruz.

Şimdi ekranımızda 3 tane seçenek olsun istiyoruz. Bunun için de şu şekilde bir claas oluşturalım.

public boolean onOptionsItemSelected(MenuItem item) {
        if(item.getItemId()==R.id.item1)
            Toast.makeText(this,"Seçenek 1 seçildi",Toast.LENGTH_SHORT).show();

        else if(item.getItemId()==R.id.item2)
            Toast.makeText(this,"Seçenek 2 seçildi",Toast.LENGTH_SHORT).show();
        else if(item.getItemId()==R.id.item3)
            Toast.makeText(this, "Seçenek 3 seçildi", Toast.LENGTH_SHORT).show();
        else if(item.getItemId()==R.id.subitem1)
            Toast.makeText(this,"Seçemek subitem1 seçildi",Toast.LENGTH_SHORT).show();
        else if(item.getItemId()==R.id.subitem2)
            Toast.makeText(this,"seçenek subitem2 seçildi",Toast.LENGTH_SHORT).show();

        return super.onOptionsItemSelected(item);
    }
}

Seçeneklere tıklandığında ekrana mesaj vermesi için if-else kullandık . Uygulamamızı çalıştıralım.

Gördüğümüz gibi ekranın sol tarafına 3 nokta geldi.

3 noktaya geldiğimizde bu seçenekler karşımıza çıkacak. Bu şekilde Activiteye menüyü bağladık .

OptionsMenüde ekranın sağ tarafında üç nokta oluşuyordu ve seçeneklerimiz vardı yani activitiye menüyü bağlamıştık. ContextMenüde ise bir nesneye menüyü bağlıyoruz. Kullanıcı nesneyi uzun tıkladığında Android içerik menüsü görünür. Ayrıca kayan menü olarak da bilinir. Üzerinde işlem yapılırken seçilen içeriği etkiler. Öğe kısayollarını ve simgelerini desteklemez. Şimdi ContextMenüyü nesneye nasıl bağlarız? Bunu örnekle göstermeye çalışayım. Mesela bir buton oluşturalım ve butona Id verelim.

 Button contextmenubutton = (Button) findViewById(R.id.button);

Şimdi bu butona aşağıdaki metotla menüye bağlıyoruz..

   @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        getMenuInflater().inflate(R.menu.menu1,menu);
        super.onCreateContextMenu(menu, v, menuInfo);
    }

getMenuInflater().inflate(R.menu.menu1,menu); metoduyla parametreye bağlıyoruz.

Şimdi seçenekleri ekleyip ekrana mesaj verelim.

@Override
    public boolean onContextItemSelected(MenuItem item) {
        if(item.getItemId()==R.id.item1)
            Toast.makeText(this,"Seçenek 1 seçildi",Toast.LENGTH_SHORT).show();

        else if(item.getItemId()==R.id.item2)
            Toast.makeText(this,"Seçenek 2 seçildi",Toast.LENGTH_SHORT).show();
        else if(item.getItemId()==R.id.item3)
            Toast.makeText(this, "Seçenek 3 seçildi", Toast.LENGTH_SHORT).show();
        else if(item.getItemId()==R.id.subitem1)
            Toast.makeText(this,"Seçemek subitem1 seçildi",Toast.LENGTH_SHORT).show();
        else if(item.getItemId()==R.id.subitem2)
            Toast.makeText(this,"seçenek subitem2 seçildi",Toast.LENGTH_SHORT).show();
        return super.onContextItemSelected(item);
    }
}

Evet şuan bir buton nesnesine menüyü verdik.

INTENT NEDİR? Android Studioda Kullanımı?

Android uygulama bileşenleri, diğer Android uygulamalarına bağlanabilir. Yapacağımız uygulamanın yapısına göre farklı aktivite sınıfları oluşturup, intent’ler aracılığı ile bunlar arasında geçiş yaparız. Android işletim sisteminde, bir Activitynin birbirlerini çağırmasını ve iletişime geçebilmesi için ortak bir yapı oluşturmuştur. Bu uygulama bileşenleri arasındaki veri alışverişini sağlayan ortak yapıya haberleşme nesnesi yani Intent denir. Nesne olmasının sebebi Intent sınıfından üretilerek kullanılmasından dolayıdır.

Kısaca Intent ‘i Activityler arasında veri transferi için kullanırız.

Intent’ler ile başka kategoride uygulamalarda çalıştırılması istenebilir, mesela uygulamanızda bir web sitesini görüntülemek istiyorsanız, bir web tarayıcı yazmak zorunda değilsiniz. Siz web tarayıcı açmak istediğinizi söylersiniz, gerekli bilgileri verirsiniz, Android uygun olan programı açar, eğer birden fazla seçenek var ise kullanıcıya sorar.

 Soru: Birden fazla Activity nasıl yapılır? Yani 2.Activity nasıl açılır, nasıl geçiş yapılır? Şimdi basit bir örnekle bunu açıklamaya çalışacağım.

Öncelikle yeni bir proje açalım. MainActivity olsun. Design kısmından ekranımıza buton, textView, EditText ekleyelim.

Biz bu butona bastığımızda yeni bir ekrana geçiş yapmak istiyoruz. Nasıl yapacağız?

Android Studio’nun sol tarafındaki java classlarının oraya gelince sağ tıklayıp;

New → Activity → Empty Activity seçelim.

Yeni açtığımız Activityin ismi de oyun ekranı olsun.

Şimdi Main Activydeki butona tıklandığında yeni bir Activitye geçmek için klasik kullanılan buton yapısını kullanırız.

import android.widget.Button;

  ((Button)findViewById(R.id.button)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
     }
        });


   

İnline olarak yazdık. İçinde ise Oyuna başla butonu yeni bir intent oluşturacağız. Normalde bir Activityi başlatmak iki satırdan oluşur.

import android.content.Intent;

(Button)findViewById(R.id.button)).setOnClickListener(new 
 View.OnClickListener() {
            @Override
            public void onClick(View v) {

Intent i = new Intent(MainActivity.this,OyunEkrani.class);
          //yani MainActivity classından OyunEkranı claasına geçiş yap.      
               //iki tarafında bildiği parola.
                i.putExtra("mesaj",et.getText().toString());
                startActivity(i);
            }
        });

Şimdi mesaj geçireceğimiz bu classla oynamamız gerekiyor. Bir ilan panosu gibi bir yere mesajları yazıyoruz oradan bütün Activitylere ulaşan mesajlar var. Oraya veriyi koyuyoruz. Oradan mesajlar alınıyor.

2.Activity yani OyunEkrani .xml ine textView ekleyelim; Amacımız mesajı bu ekranda yazdırmak. Bir bu haliyle çalıştıralım.

Bir ekrandan diğerine geçiş yapabildik. Fakat mesajı geçirmek istiyoruz. Yani textView yerine “Oyuna hoşgeldiniz +isim .” demek istiyoruz. Bunu yapabilmek için mesajımızı geçirmek lazım.

EditText et =(EditText)findViewById(R.id.editText);

Aldığımız mesajı intent sırasında yeni Activitye geçirmek istiyoruz. İnlinde sınıf içinde yeni bir sınıf tanımlıyoruz. İçindeki bir değişkene erişebilmek için final kullandık. Fakat final olunca içine bir şey ekleyemiyoruz.

final  EditText et =(EditText)findViewById(R.id.editText);;

        ((Button)findViewById(R.id.button)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent i = new Intent( MainActivity.this,OyunEkrani.class);
                i.putExtra("mesaj",et.getText().toString());
                startActivity(i);
            }
        });

Activit2 yani OyunEkrani bize MainActivityden gelen mesajı verecek.

Intent i= getIntent();


        Intent i= getIntent();
        String s=  i.getStringExtra("mesaj");
        TextView td =(TextView)findViewById(R.id.textView2);
        td.setText(s);

Uygulamamızı çalıştırdığımızda;

Buraya isim girip butona bastığımızda diğer ekrana buradaki EditTextdeki girilen isim mesajı yazdırılacak.

Android Toast Kullanımı

Android uygulama geliştirme, esnasında sıklıkla ekranda mesaj gösterme ihtiyacı hissedilmektedir. Bu amaçla da kullanılan kod kalıbı aşağıdaki şekildedir.

Java Listener Ve View Kavramları, Ekrana Müdahale,R Kaynak Dosyaları?

Bu yazıda resourcelerden, resource filelerden bahsedeceğim. Java kodu ile ekrandaki bileşenlere nasıl erişeceğimizden bahsedeceğim.

Android’in altında yatan bazı dosya yapılarından bahsetmeye çalışacağım.

İlk olarak string.xml;

 Bu ilk olarak uygulamamızı çalıştırdığımızda üstte gözüken MyApplication yazısıdır. Kendi uygulamanızın ismini değiştirmek isterseniz buradan değiştireblirsiniz.

Resource dosyaları aslında metin anlamında kaynakları tuttuğumuz yer. Yani bu birden fazla dil olabilir veya herhangi bir başka metin yazıyor olabilirsiniz. Buraya hardcoded olarak kodun içine stringler olarak yazmak mümkün olmakla birlikte yapılmaması gereken şeylerden birisi. Çünkü, bunlar sonuçta arayüzle gösterilecek olan mesajlar , mesela bir mesajı değiştirip her yerde değişmesini istiyor olabilrsiniz, dolayısıyla tek bir kaynaktan kontrol ediliyor olması bizim için önemli  o yüzden resource dosyaları oluşturuluyor Android de bize bu imkanı veriyor. Buraya kendi metinlerimizi ekleyebiliriz. Bir örnek kodla açıklamaya çalışacağım,

Matematik sorusu adlı bir string ekliyoruz. Bu bizim program içinde kullanacağımız değişken ismi. Yani biz bu kaynağa bu ismi kullanarak erişeceğiz.Yanında bir etiket oluyor buna da soru diyelim. 

Bu mesajı biz arayüzümüze nasıl ekleyeceğiz? Activity main kısmına gelelim. Designden button ve iki tane textView ekleyelim ekrana.  textView de text kısmında adını kendimiz yazmak yerine resource olarak yazıyoruz. Yani oluşturduğumuz olan resource dosyasından arayüzle bir bağlantı kuruyoruz ve resurce dosyasından o kaynakdan okunup arayüzde göstelecek.



İkinci textView deki testi boş bırakalım biz butona  tıkladığımızda cevap gelsin.

Eklenen bütün kaynaklar bir id ile kaydediliyor. Ve bunları bizim için Android Studio hazırlıyor.

 Şimdi MainActivity ‘e gelelim . Burada grafik arayüzünü kodlayacağız. Yani kodlardan grafik arayüzüne erişmeye çalışacağız.  Grafik  arayüzündeki bileşenlere erişebilmek için idsini kullanarak erişmeye çalışıyoruz. Bunun için,

 findViewById(R.id.erişmek istediğimiz bileşenin ismi çıkıyor zaten).

Şimdi biz sorunun değil cevabın metniyle oynayacağız dolayısıla cevabın idsini yazıyoruz. Butona tıklandğını algılamak için kod yazacağız. Bunlara erişebilmek için değişken içine atıyoruz. Hemen bizi uyarıyor tabiki o yüzden değişkenleri import etmemiz gerekiyor. Ama hala problem oluyor üstüne gelince söylüyor zaten. Yani tip dönüşümü yapmamız gerekiyor.

İkinci textView deki testi boş bırakalım biz butona  tıkladığımızda cevap gelsin.

Eklenen bütün kaynaklar bir id ile kaydediliyor. Ve bunları bizim için Android Studio hazırlıyor.

Şimdi listener kavramını açıklayayım. Listener, aktif bir bileşenimiz varsa bununla ilgili listener classı olmalı. Bir bileşenimiz var, bu butona tıklanıyor ve class hangisini dinliyor ? Bunun için bir interface’i implemente etmemiz gerekiyor. İmplement demenin sonucunda OnClick diye bir metot olması lazım .

Buttonun altına b.setonClickListener(this); diye bir şey ekleyeceğiz. Bunun anlamı b.tıklantığında bu class dinlensin.

Şimdi yapmak istediğimiz şey bu textViewin metnini değiştirmek. TextViewi yukarıda tanımlayacağız bunun için ,değişkene her yerden erişebilmek için . Yani butona tıklanınca resource dosyasında kayıtlı olan metni al bu textView in metni olarak ata.

Butona tıkladığımızda, aşağıdaki gibi sorunun cevabını bize verecek.

FireBase Nedir?

Her şey için yeni bir uygulamanın olduğu günümüzde, bir mobil uygulama ile insanlığın acil ihtiyaçlarını karşılayan girişimci biriyseniz, Firebase’i  bilmek istersiniz.

Google tarafından yeni özelliklerin eklenmesiyle gelişen Firebase, uygulamanızı oluşturmanıza, geliştirmenize yardımcı olan, bütün bu ihtiyaçları karşılayabilme iddiasında ücretsiz kullanım da sunan bir mobil uygulama geliştirme platformudur.

Ne işe yarar?

Günümüzde uygulamalar platform fark etmeksizin aynı veriye her cihazdan erişmek istiyor. Uygulaması, birçok kullanıcı tarafından yüklenen geliştiricilerin de kayıt – oturum bilgilerini tutma, uygulamaların kullanım verilerini analiz etme, yeni duyurular yapmak için aynı zamanda kullanıcıya bildirim gönderme, uygulamayı test etme gibi işlemleri rahatlıkla yönetebileceği bir yönetim paneli gerekiyor. İşte Google tarafından yeni özelliklerin eklenmesiyle sürekli kendini geliştiren Firebase platformudur.

Hizmetler bulutta barındırılır ve geliştirici adına çok az veya hiç çaba göstermeden ölçeklenir.

“Bulutta barındırılan” derken, ürünlerin Google tarafından tamamen korunan ve işletilen arka uç bileşenlere sahip olduğunu kastediyorum. Firebase tarafından sağlanan Müşteri SDK’ları, uygulamanız ile hizmet arasında herhangi bir ara katman oluşturmaya gerek kalmadan doğrudan arka uç hizmetleriyle etkileşime girer. Bu nedenle, Firebase veri tabanı seçeneklerinden birini kullanıyorsanız , uygulamanızdaki veri tabanını sorgulamak için genellikle kod yazarsınız.

Firebase ne tür uygulamalar için iyidir?

Firebase ürünlerinin yardım edebileceği uygulama türlerinin sınırı yoktur. Kullanılabileceği platformların sadece sınırları vardır. iOS veAndroid , Firebase SDK’larının ana hedefleridir ve web , Flutter Unity ve C ++ için artan destek vardır. Ayrıca, gerek duyabileceğiniz herhangi bir arka uç bileşeniyle birlikte kullanılabilecek çeşitli diller için bir yönetici SDK’sı olduğunu da bilmelisiniz. Bu SDK’ların üzerinde, Firebase ile geliştirmeyi daha da kolaylaştırmak için bir sürü yardımcı program sağlayan FirebaseUI ( Android , iOS , web ) adlı bir kütüphane vardır.

Firebase’de yeni bir proje oluşturmak için yapılması gereken adımlar;


Proje ekle’yi seçtikten sonra karşımıza proje oluşturma sayfası çıkıyor.

Proje adının android projenizle aynı olmasına dikkat etmeniz gerekiyor. Çünkü gerçekleştirilen uygulamanın ismiyle firebase veri tabanındaki uygulamanın ismi aynı olmaz. Ben örnek, Android projesi açtım.

Bu işlemi yaptıktan sonra  proje  için veri tabanı açılmış olur. Karşınıza ios, android ya da web seçenekleri gelir ve  uygulamanın geliştirileceği platforma göre seçim yapılır. Benim uygulamamda Android işletim sistemi kullanılacağı için Android seçtim.

İlk adım olarak manifest dosyasında bulunan projenin tam adını paket ismi olarak girilir. Oluşan JSON dosyası indirip projeye entegre edilir .

Yukarıda ki bulunan kodlar projeye eklenir.Eğer ekleme işlemi hatalı olur ise proje veritabanına ulaşamaz.

Ayrıca app kısmına Firebase veritababanı kütüphanesini de eklenmesi gerekiyor :

compile ‘com.google.firebase:firebase-database:10.2.0’

Böylelikle projemiz için veri tabanımızı oluşturmuş ve bunu da projeye eklenmiş olundu. Yapılacak işlemlerin veritabanında uygulanabilmesi için gerekli izinler verilir. Bunun için Firebase’e gidip projenin veritabanı açıldıktan sonra yanındaki menüden Database’in seçilmesi gerekiyor.

Interface ve Abstract class arasındaki farklar nelerdir?

Bu ikili, nesne yönelimli programlamada (OOP) sınıfları soyutlamaya yarayan yöntemlerden ikisidir. Bu ikisinin ortak oldukları ve farklı oldukları yönler vardır.

1) Abstract

Yazdığımız sınıflar arasında inheritance(kalıtım) uygularken kullanırız. Alt sınıflar abstractsınıfı inherit alırlar. Abstract class içindeki implement edilmiş tüm method’lar diğer class’da da geçerlidir.

Abstract classdan implement ettiğimiz bir class içerisinde, sadece abstract class içerisinde abstract olarak tanımlanmış method, property gibi vb.lerini implement etmek mecburidir. Diğer method’lar zaten tanımlıdır ve implement edilmesi mecburi değildir.

Abstract sınıflar genelde is-a ilişkilerinde kullanılır.
Örnek vermek gerekirse;

+Ferrari is-a Araba

Ferrari bir arabadır ve arabanın sahip olduğu tüm özelliklere sahiptir.

abstract class Araba
{
public string Marka { get; set; }
public int VitesSayisi { get; set; }
// Kısacası arabaların sahip oldukları tüm ortak özellikler
public abstract void MaximumHiz();
// Override edilecek methodumuz çünkü her arabanın kendine özgü bir maximum hız bilgisi vardır
}
/// /// Ferrari’yi Araba sınıfımızdan inherit alıyoruz. ///
class Ferrari : Araba
{
/// /// Maximum hız bilgimizi override ediyoruz ve Araba abstract sınıfımızın sahip olduğu tüm özelliklere sahip oluyor. ///
public override void MaximumHiz()
{
Console.WriteLine(“Ferrari’nin maximum hızı: 300”);
}
}
Örneğimizden de anlaşılacağı gibi araba örneğimizden yola çıkarak “Araba” isminde bir abstract sınıf oluşturuyoruz ve “Ferrari” bu sınıfdan inherit alarak Arabaların sahip olmuş oldukları tüm ortak özelliklere sahip olmuş oluyor.

Abstract sınıfın genel özelliklerini sıralayacak olursak;

  1. Kod içerisinde “new” anahtar sözcüğü ile oluşturulamazlar.
  2. Bir sınıf sadece bir abstract sınıfı inherit alabilir.
  3. Inherit alıcak sınıflar arasında genelde “is-a” ilişkisi vardır.
  4. Abstract sınıfda method ve değişkenler tanımlanabilir.

2) Interface

Interface sınıfında sadece method tanımları bulunur. İçlerine kod parçacığı yazılmaz. İçerisinde tanımlanan method tanımları bu interface’i implemente edecek diğer sınıflar tarafından implement edilmesi zorunludur.

Interfaceler başka bir interface den inherit olabilirler.
Interface’ler genelde can-do ilişkisi vardır.

Örnek vermek gerekirse;

+Ferrari can-do drive itself

Ferrari kendi kendini sürebilir .Gibi yapabileceği ek özellikler interface olarak tanımlanıp, implemente edilebilir./// /// Bazı arabalar cabriolet olabilir hepsinin ortak bir özelliği değildir. ///

interface ICabrioled {

void TavanTipi(); }

abstract class Araba{

public string Marka { get; set; }

public int VitesSayisi { get; set; }

// Kısacası arabaların sahip oldukları tüm ortak özellikler

public abstract void MaximumHiz();

// Override edilecek methodumuz çünkü her arabanın kendine özgü bir maximum hız bilgisi vardır

}

/// /// Ferrari’yi Araba sınıfımızdan inherit alıyoruz ve yeniden şekillendiriyoruz. Ferrarimiz cabriolet ve ICabriolet özelliğini implemente ediyoruz. ///

class Ferrari : Araba, ICabrioled {

/// /// Maximum hız bilgimizi override ediyoruz ve Araba abstract sınıfımızın sahip olduğu tüm özelliklere sahip oluyor. ///

public override void MaximumHiz() {

Console.WriteLine(“Ferrari’nin maximum hızı: 300”); }

/// /// ICabrioled’i implemente ettiğimiz için TavanTipi methodumuzu tanımlıyoruz. ///

public void TavanTipi() {

Console.WriteLine(“Metal tavan”); }

Interface’ler içerisine kod parçacıkları yazılmaz, sadece method tanımları bulunur. Bunuda gösterebilmek amaçlı sadece “TavanTipi” isminde bir tanımlama yaptık ve “Metal tavan” olarak belirttik.

Interface sınıfının genel özelliklerini sıralayacak olursak;

  1. Kod içerisinde “new” anahtar sözcüğü ile oluşturulamazlar.
  2. Bir sınıf birden fazla interface implemente edebilir.
  3. Implemente edicek sınıflar arasında genelde “can-do” ilişkisi vardır.
  4. Interface içerisine sadece boş method’lar tanımlanabilir.