Menü İşlemleri

Android Menü İşlemleri

Andorid işletim sistemiyle Uygulamalara menu ekelnebilmektedir.Andorid 3.0 ile birlikte menüleri düzenli bir hale getirebilen ActionBar isimli bir activity elemanı da bu sisteme eklenmiştir.

Menü işlemlerinin geerçekleştirilebilmesi için bir kaç yöntem bulunmaktadır.

XML Dosyası İle Menü Oluşturma

Her activitynin kendisine iliştirilmiş olan bir menu nesnesi bulunmaktadır.Menu yaratmak için activitiynin onCreteOptionsMenu metodunda hangi menunun seçileceği belirlenir. Menuye ilişkin xml dosyaları res klasörü altında menu isimli bir dizine atılmalıdır.Böylelikle R sınıfı içerisnde menu isimli bir sınıf altında ilgili xml dosyasıyla aynı isimide bir değer oluşturulacaktır.

Menuye ilişkin xml dosyasının tepe noktası Menu isimli bir düğümdür.Menu elemanı altında grup ya da Item elemanları bulunabilir.Item elemanları her menuye ilişkin elemanlardır.

Her bir elemanın ne iş yapacağına ilişkin işlemler onOptionsItemSelected isimli metod içerisinde ele alınır.

onCreateOptions metodunda menünün gorüntülenebilmesi için true değerinin dönülmesi gerekmektedir.Eğer false ile dönülürse menü gürüntülenmez.

onOptionsItemSelect metodu ilgili işlemleri yaptıktan sonra true ile döndürülmelidr.Bu metod içierisinde mutlaka taban sınıfın onOptionsItemSelect metodu çağrılmalıdır.(Home tusu gibi tuşlar için)

Bir xml menüsünün o activitye eklenebilmesi için onCreatreOptionsMenü içerisinde aşağıdaki gibi bir işlem yapılmalıdır.

 this.getMenuInflater().inflate(R.menu.menu_main, menu);

Burada activitye iliştirilmiş olan menu listesine menu_main.xml içerisinde beliritilmiş olan xml eklenmiştir.Menünün eklenip görüntülenmesi işine infilate terimi kullanılmaktadır.

Menuye ilişkin hangi menude hangi işlem yapılacağı onOptionsItemSelected metodu içierisinde belirlenmketedir.Bu metodun parametresi kullanıcı tarafından seçilmiş olan MenuItem nesnesidir. MenuItem nesnesinin id elemanı ile bu menuler ayrıştırılabilir.

Bir menunun seçilebilir olup olmamaması checkable isimli Attribute ile belirlenebilir.Seçme işleminin dinamik yapılması için programcı MenuItem sınıfın setChecked metodunu cagırmalıdır. Benzer şekilde dinamik olarak menunun üzerindeki yazı değiştirilmek ya da elde edilmek isteniyorsa setTitle ve getTitle metodu çağrılabilir.

Menunun sıra numarası getOrder isimli metodla elde edilebilir.


Android 3.0 ile birlikte menu işlemleri için onClick isimli bir Attribute eklenmiştir. Bu metodun parametresi MenuItem turunden ve geri donus degeri boolean türünden olmak zorundadır.

onClick ozelliği set edilmiş olan bir menu için onOptionsItemSelected metodu çağrılmaz.

Anahtar Notlar: Android sdk 3.0 dan önce onCreateOptionsMenu metodukullanıcı ilk olarak bir menu işlemi yaptığında çağrılmaktaydı. sdk 3.0 ile birlikte activity nin yaşam döngüsü içerisinde create edildikten hemen sonra çağrılmaktadır Anahtar notlar: Menu de bir activity nesnesine ait olduğundan örneğin ekran döndürülmesinde menu için dinamik olusturulmus alanlar geri gelmeyecektir. Bu durumda programcı daha önce belirtilen saklama seçenekleriyle (onSaveInstanceState, onRestoreInstanceState) saklamalıdır.

Dinamik Menu Olusturlması (Başlık olacak) Programcı isterse dinamik olarakta menu ekleyebilir. Bu işlemi tipik olarak onCreateInstanceMenu içerisinde yapmak iyi bir işlemdir. Menu sınıfının setIntent isimli metoduyla herhangi bir intent referansı menuye atanabilir. Bu durumda o menu seçildiğinde otomatik olarak startActivity çağrılacaktır. Dinamik oluşturulan menulerde setOnMenuItemClickListener metoduyla ilgili menuye ilişkin ne yapılcağı onMenuItemClick metodunu override ederek belirlenebilir.

Dinamik menu eklemek için menu sınıfının add metodu kullanılmalıdır.Add metodunun 1. parametresi menu grup numarası, 2.p arametresi Id değeri , 3 .parametresi hangi sırada bulunacagı değeri , 4.parametre değeri ise menü yazısının belirten Stringdir.Add metodu zincir çagırmaya uygundur.Yani geri dönüş değeri menuItem türündendir. Ve programcı bu menuItem nesnesinin istediği gibi kullanabilir.

 public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        //this.getMenuInflater().inflate(R.menu.menu_main, menu);
        menu.add(0, 7, 100, "CSD").setIntent(IntentUtil.web("www.csystem.org"));
        menu.add(0, 1, 100, "Elma").setOnMenuItemClickListener(this);
        menu.add(0, 2, 200, "Armut").setOnMenuItemClickListener(this);
        menu.add(0, 3, 300, "Karpuz").setOnMenuItemClickListener(this);
        menu.add(0, 4, 400, "Çıkış").setOnMenuItemClickListener(this);

        return true;
    }

[Dropbox 041-XMLMenu]

String Kaynağının kullanımı

Bir programın birden fazla dil seçeneiğine göre versiyonları yazılacaksa bu durumda Stringlerin programcı tarafından ayrı ayrı verilmesi iyi bir yöntem değildir.Bunun yerine adına String Kaynağı denen String Resource isimli kaynak kullanılabilir.Android projelerinde kaynaklar ikiye ayrılır.

  • Değer ya da yazı tipi kaynaklar
  • Dosya tipi kaynaklar

String kaynağı yazı tipi kaynaklar grubundadır.Aslında bir projeye hiç bir işlem yapılmasa bile ilk açıldığında proje bazı bilgileri String kaynağından alabilmektedir.

Her kaynakta olduğu gibi String kaynağı içinde çeşitli bilgiler R sınıfınının string sınıfı içersinde tekil bir id ile kaydedilir.

String kaynakları res dizinindeki values içerisinde strings.xml dosyasında tutulmaktadır.

Değer tipi kaynaklar xml dosyası içerisinde resources isimli tepe elemanı içerisinde bulunmaktadır.String kaynaklarına ilişkin genel biçim şöyledir.

<string name="app_name">MyApp</string>

Menu elemanları da string kaynağından textlerini alabilmektedir.

Cihazın dil seçeneğine göre kaynak oluşturma işlemi için birden fazla xml dosyası kullanılmalıdır. Bu xml dosyaları dile ilişkin bir son takı almalıdır.

[Supporting Different Languages]

Android Studio içerisinde proje bölümü Android seçiliyken String kaynakları strings.xml içerisinde yine strings.xmller olarak gösterilmektedir.

Verilen dil seçeneklerine ilişkin xmller cihazın dil ayarı değiştikçe ona göre kullanılmaktadır.Eğer dil desteği olmayan herhangi bir dil seçilirse default strings.xml içerisindeki xml kullanılmaktadır.

Herhangi bir String kaynağina ilişkin kaynağı kullanmak için @String/ ile başlatılmalı ve hangi kaynak kullanılacaksa o kaynağın ismi verilmelidir.

Aynı isimde bir String kaynağı proje içerisinde geçerisizdir.

Default String kaynağında minimum her elemanın bulunması gerekir.Eğer dile özgü kaynaklarda bulunmayan kaynaklar o dil seçilirse default kaynaktan alınır.

[Dropbox 043-StringResoruce]

String kaynakları program içerisinden de kullanıabilimektedir.Bunun için context sınıfın getResources metodu çağrılır.getResources metodu Resources türünden bir referans vermektedir.Bu sınıfın getXXX metodları ile ilgili kaynağa ilişkin bilgiler R sınıfında oluşturulan tekil değerler verilerek eldee edilebilir.

R sınıfından bir kaynağa erişim aşağıdaki gibi yapılabilir.

public void onOKButtonClicked(View v)
{
        Resources res = this.getResources();
        String str = res.getString(R.string.TEXTVIEW_ADDRESS); 

        Toast.makeText(this, str, Toast.LENGTH_LONG).show();
}

Hemen hemen tüm activity elemanlarının id parametreli setText metodu bulunmaktadır. Bu metodla ilgili string kaynağının idsi verilerek String kaynağı set edilebilir.

Örneğin:

  private void init()
  {
        m_textViewName = (TextView)this.findViewById(R.id.MAINACTIVITY_TEXTVIEW_NAME);
        m_textViewName.setText(R.string.TEXTVIEW_NAME);
  }

Android işletim sisteminin içindeki menuler gruplandırılabilmektedir. Xml kullanılacaksa gruplandırma işlemi gruplandrılacak menuleri Group isimli bir eleman altında toplamala gerçekleştirilebilir. Dinamik menu kullanacaksa yani menu sınıfının add metodu kullanılacaksa bu metpodunun 1. parametresi grup numarası olabilir.

Grup kavramı aynı gruba ait menuleri yönetmeyi kolaylaştırmak amaçlıdır.

[Dropbox - 044-MenuGroups]

Grup elemanları seçilebilir olabilmektedir. Bunun için checkableBehavior değeri verilmeilir. checkableBehavior değeri

  • none verilirse(default değeri none) bu grup içerisindeki hiç bir veri elemanı seçilebilir olmaz.
  • all verilirse grup içierisindeki veri elelmanlarının hepsi seçilebilir duruma gelir.
  • single verilirse bu elemanlardan aynı anda sadedce biri seçilebilir hale gelir.

menu_main.xml

 <group android:visible="true" android:checkableBehavior="single">
        <item
            android:id="@+id/ACTION_NORMAL"
            android:orderInCategory="100"
            android:title="NORMAL"/>
        <item
            android:id="@+id/ACTION_PAGE"
            android:orderInCategory="100"
            android:title="PAGE"/>
    </group>