JavaveAndroidHakkında

Android Yazılım geliştirme konusunda sürekli bilgi akışı sağlayan, soru-cevaplar ile öğrenme gerçekleştirmeyi amaçlayan bir eğitim süreci planlıyoruz.

Menü Kavramı etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Menü Kavramı etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

14 Şubat 2015 Cumartesi

Intent Tabanlı Menü İtemleri Eklemek

23:14

    Bazı durumlarda seçilen menü itemi aracılığıyla Intent(Bu başlığı daha detaylı ele alacağız) kullanarak bir activity veya başka bir uygulama açmak isteyebilirsiniz. Belirli menü itemi için kullanmak istediğiniz intenti (niyet, maksat) biliyorsanız, uygun item seçildiğinde ilgili callback(geri dönüş) metoduyla startActivity() metoduyla intent başlatabilirsiniz.

    Eğer intent işlemini başlatacak olan uygulamayı kullanıcının cihazındaki içeriğe göre belirlemezseniz, bu intenti çağıracak menü itemi eklemek fonksiyonel olmayan bir menü işlemiyle sonuçlanır. Çünkü, Inten bir Activity'i çözümlemek olmayabilir. Bu sorunu çözmek için, Android Intent'in işleme alabileceği aktiviteler bulduğunda dinamik olarak menü itemlerini ekleme imkânı tanır.

    Menü itemi eklemek, kabul edilen bir intent için müsait olan aktiviteleri temel alır.

  1. Intent tanımını CATEGORY_ALTERNATIVE ve/veya CATEGORY_SELECTED_ALTERNATIVE şeklinde, diğer gereklilikleri de ekleyerek yapınız.
  2. Menu.addIntentOptions() metodunu çağırın. Android böylece uygulamaları tarayacak ve intenti işleyip menüye ekleyecektir.
     Intent ile uyumlu bir uygulama yüklü bulunmadıysa eğer, herhangi bir menü itemi eklenmeyecektir.


    ÖRNEK:

@Override
    public boolean onCreateOptionsMenu(Menu menu){
        super.onCreateOptionsMenu(menu);

        // Create an Intent that describes the requirements to fulfill, to be included
        // in our menu. The offering app must include a category value of Intent.CATEGORY_ALTERNATIVE.
        Intent intent = new Intent(null, dataUri);
        intent.addCategory(Intent.CATEGORY_ALTERNATIVE);

        // Search and populate the menu with acceptable offering applications.
        menu.addIntentOptions(
                R.id.menu_archive,  // Menu group to which new items will be added
                0,      // Unique item ID (none)
                0,      // Order for the items (none)
                this.getComponentName(),   // The current activity name
                null,   // Specific items to place first (none)
                intent, // Intent created above that describes our requirements
                0,      // Additional flags to control items (none)
                null);  // Array of MenuItems that correlate to specific items (none)

        return true;
    }


     Menü item başlığını ve menü item iconunu android:label değeri belirleyerek intent filtreleme yaptığımızda her tanımlı menü aktivitesi için tanımlı bir intent sağlanır. addIntentOptions() metodu, eklenmiş menü itemi sayısını döndürür.

NOT: addIntentOptions() metodunu çağırdığınızda, ilk argüman ile tanımlanmış gruplanmış tüm menü itemlerini Override eder.


Aktivitinizin diğer Menülere eklenmesine izin vermek


    Aktivitinizin servislerini diğer uygulamalara da teklif edebilirsiniz. Böylece uygulamanız diğer uygulamaların menülerinde de yer alabilir. Bu düzenlemeleri AndroidManifest.xml de yapmanız gerekiyor.

    Diğer uygulama menülerinde yer alabilmek için, bilindik şekilde bir intent filter yapmanız lazım ve bu tanımlamayı yaparken, CATEGORY_ALTERNATIVE ve/veya CATEGORY_SELECTED_ALTERNATIVE değerlerini intent filter kategorisi için tanımladığınızdan emin olmalısınız.

ÖRNEK:

<intent-filter label="@string/resize_image">
    ...
    <category android:name="android.intent.category.ALTERNATIVE" />
    <category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
    ...</intent-filter>

Intenler hakkında daha fazla bilgi için Buradan

Soru Ve Görüşleriniz için : AndroidVeJava

Android - Menu Kavramı Menü Grubu Oluşturmak - 8

22:35

Menü Grubu Oluşturmak

    Menü grubu ifadesi, belirli davranışları paylaşan menü itemlerinden oluşan grupları ifade eder. Gruop ile ;


  • setGroupVisible() metoduyla tüm itemleri Show(göster) veya Hide(gizle) edebilirsiniz.
  • setGroupEnabled() metoduyla tüm itemleri aktif veya pasif edebilirsiniz.
  • setGroupCheckable() metoduyla tüm itemlerin seçilip seçilmeyeceğine karar verebilirsiniz.

    Gruplama işlemini menu resource içinde <item> elementi altında <group> etiketi altında veya add() metodu ile grup ID tanımlayarak kodlayabilirsiniz. 

Aşağıda menü grubu içeren menu resource örneğini görebilirsiniz.


Örnek:

<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">

    <item android:id="@+id/action_settings"
        android:title="@string/action_settings"
        android:orderInCategory="100" app:showAsAction="never"/>


        <item android:id="@+id/menu_save"
            android:icon="@drawable/menu_save"
            android:title="@string/menu_save" />
        <!-- menu group -->
        <group android:id="@+id/group_delete">
            <item android:id="@+id/menu_archive"
                android:title="@string/menu_archive" />
            <item android:id="@+id/menu_delete"
                android:title="@string/menu_delete" />
        </group>

</menu>


    Grup içindeki itemler, ilk iteml ile aynı düzeyde görünecektir.(Menü'deki tüm bu üç item özdeşlerdir. Tabii ki, yukarıda bahsedilen metotlar yardımıyla group ID vererek grup içindeki iki itemin davranışlarını değiştirebilirsiniz.) Sistem gruplamış  olduğunuz itemleri asla ayırmayacaktır. örnek olarak; her itemi android:showAsAction="ifRoom" ile tanımlarsanız, bu itemler ya action bar'da ya da action overflow'da görünecektir.


Checkable Menü İtemlerini kullanmak 

    On/Off gibi iki seçeneğe sahip menü tasarımlarında kullanabileceğiniz kullanışı bir yetenektir. Aşağıdaki şekilde örnek bir gösterim yer almaktadır.

    android:checkAbleBehaviour niteliği aşağıdaki özellikleri taşıyabilir.

  •  single Grup içindeki sadece bir itemin seçilebilir olmasını istediğimizde,
  • all Tüm itemlerin seçilebilir olmasını istediğimizde,
  • none Hiç bir iteme bu özelliği vermek istemediğimizde.


    android:checked niteliğini kullanarak varsayılan olarak seçili gelmesini istediğiniz itemleri <item> elementi içinde belirleyip ardından kod satırında setChecked() bu metod içinde de işlemleri yapabilirsiniz.


    Seçilebilir item tıklandığında, sistem onOptionsItemSelected() metodu gibi sırasıyla tanımlamış olduğunuz geri dönüş metotlarını çağırır. Bu alanlarda checkbox durumunu ayarlamanız gerekir, çünkü checkbox veya radio butonlar durumlarını otomatik olarak değiştirmezler. Yani sizin XML'de yapmış olduğunuz tanım java dosyasında da tanımlanmalı ve Selected şeklinde belirtilmelidir. İtemlerin mevcut durumlarını, isChecked() metodu ile kontrol edebilir, setChecked() metoduyla da seçili duruma getirebilirsiniz.

Örnek:

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_archive:
            case R.id.menu_delete:
                if (item.isChecked()) item.setChecked(false);
                else item.setChecked(true);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }


    Bu şekilde seçili durumu ayarlamazsanız, itemin görünür durumu kullanıcı bu itemi seçtiğinde değişmeyecektir.(checkbox veya radio button). View'in durumunu ayarlarsanız, kullanıcı ayarlamaları yapıp, daha sonra geldiğinde de görünür kıldığınız bu seçimler kullanıcının karşısına gelecektir. 

NOT: Checkable Menü itemleri oturum baslı ve app destroy edildiğinde kayedilmeyen işlemlere yöneliktir. Kullanıcı için ayarları kaydetmek istediğiniz durumda, SharedPreferences kullanarak verileri kayıt etmelisiniz. Bu konuya ileride değineceğiz.

Soru Ve Görüşleriniz için : AndroidVeJava



13 Şubat 2015 Cuma

Android - Menu Kavramı Pop-Up Menü Oluşturmak - 7

18:17

Pop-Up Menü Oluşturmak

     Pop-Up menüler, View'ler ile ilişkilendirilmiş tipik menülerdir. Anchor View'ın altında yer olduğunda veya diğer View'lerin üzerinde görünür. Aşağıdaki durumlarda kullanışlı bir seçenektir. Bunlar; 


  • İşlemler için, belirli içerik ile alakalı overflow-stil menü tanımlarken ( Gmail'de email başlığı gibi şekil 1) 

Şekil 1 Gmail app'den Pop-Up Menü Örneği

NOT: Bu yapı, genellikle seçili itemlerin etkilendiği Context Menü ile aynı değildir. Seçili itemleri etkileyen işlemler tayin etmek için, contextual action mode veya floating context menü kullanınız.

  • İkinci kısım komut cümleleri tanımladığınızda( "Add" şeklinde etiketlenmiş ve farklı bir "Add" işlemi için tanımlanmış Pop-Up Menü türetmek gibi )
  • Spinner' e benzer, seçimleri kalıcı olarak tutmayan drop-down(aşağı açılır menü) tanımlarken,

NOT: Pop-Up Menü, diğer bir çok özellik gibi Android 3.0 (API Level 11) ile birlikte geliştirilmiştir. 



    Eğer Pop-Up menünüzü XML içinde tanımlıyorsanız, yapmanız gerekenler aşağıdaki gibidir.

  1. PopupMenu yü, mevcut uygulamanın Pop-Up menüyle ilişkilendirilecek Context ve View'lerini parametre alacak şekilde  kendi yapıcı metodu yardımıyla hazırlayın,
  2. MenuInflater kullanarak, PopupMenu.getMenu() ile döndürülecek olan Menü nesnesindeki menü kaynağınızı inflate edin. API Level 14'ten itibaren, PopupMenu.inflate() kullanılabilir.
  3. PopupMenu.show() metodunu çağırın.

Örneğin; android:onClick niteliğiyle oluşturulmuş Pop-Up Menü gösterimi


XML kodu,

  • layout/activity_menu.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"  tools:context=".MainActivity">

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

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_overflow_holo_dark"
        android:contentDescription="@string/descr_overflow_button"
        android:onClick="showPopup" />

</RelativeLayout>


  • menu/actions.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/new_game"

        android:title="new_game"
        app:showAsAction="ifRoom"/>
    <item android:id="@+id/help"

        android:title="help" />
</menu>

  • Java kodu

public class MainActivity extends ActionBarActivity {

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


    public void showPopup(View v) {
        PopupMenu popup = new PopupMenu(this, v);
        MenuInflater inflater = popup.getMenuInflater();
        inflater.inflate(R.menu.actions, popup.getMenu());
        popup.show();
    }
...



    API Level 14 ve daha yeni sürümlerde, PopupMenu.inflate() metodu yardımıyla, 2 satırı kombine edebilirsiniz.

    Menü, kullanıcını menü alanı dışına tıklamasıyla veya bir item seçmesi ile görevini tamamlar. Bu görevi bitirme (dismissed) olayını, PopupMenu.onDismissListener() metodu ile takip edebilirsiniz.

Pop-Up Menü'de Tıklama Olaylarını Ele Almak


    Kullanıcı Menü itemlerinden birini seçtiğinde işlem gerçekleştirmek için, PopupMenu.onMenuItemListener arayüzünü uygulamalı ve bunu PopupMenu'ye setOnMenuItemclickListener() metodunu çağırarak register etmelisiniz. Kullanıcı herhangi bir item seçtiğinde, uygulamanızın arayüzünden sistem onMenuItemClick() geri dönüş metodunu çağırır. 

Örnek:

---Yukarıda bahsettiğimiz dizinlerde tanımlanan kaynak dosyalarından sadece java dosyasına eklediğimiz . Pop-Up Menü oluşturduğumuz kodun yerine bu kodu ekliyoruz.


 public void showPopup(View v) {
        PopupMenu popup = new PopupMenu(this, v);

        // This activity implements OnMenuItemClickListener
//        popup.setOnMenuItemClickListener();

        popup.inflate(R.menu.actions);
        popup.show();

        popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            public boolean onMenuItemClick(MenuItem item) {
                TextView view1 = (TextView) findViewById(R.id.hello);
                view1.setText("changed by Pop_Up menu");
                return true;
            }

    });
    }


Örnek Kod'un projesi için Buradan..
Soru ve Görüşleriniz için ise AndroidVeJava




Android - Menu Kavramı ListView veya GridView'de Yığın Contextual Actions Aktif Etmek - 6

00:44

ListView veya GirdView'de Yığın Contextual Actions Aktif Etmek


    Eğer ListView veya GridView içinde item setiniz var ise ve kullanıcının yığın işlemleri (batch actions) gerçekleştirmesini istiyorsanız şunları yapmalısınız;

  • AbsListView.MultiChoiceModeListener() metodunu arayüze uygulamalı ve bunu setMultiChoiceModeListener() metodu ile view gruba ayarlamalısınız. Listener's dönüş metodunda, contextual action bar için, action itemlere yapılan tıklamalara verilecek cevap işlemleri belirleyebilir ve diğer ActionMode.Callback arayüzünden miras alınan(inherited)dönüş metotlarını işleme alabilirsiniz.
  • setChoiceMode() metodunu CHOICE_MODE_MULTIPLE_MODAL parametresi ile çağırın.

Örnek Kod:



ListView listView = getListView();
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
listView.setMultiChoiceModeListener(new MultiChoiceModeListener() {

    @Override
    public void onItemCheckedStateChanged(ActionMode mode, int position,
                                          long id, boolean checked) {
        // Here you can do something when items are selected/de-selected,
        // such as update the title in the CAB
    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        // Respond to clicks on the actions in the CAB
        switch (item.getItemId()) {
            case R.id.menu_delete:
                deleteSelectedItems();
                mode.finish(); // Action picked, so close the CAB
                return true;
            default:
                return false;
        }
    }

    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        // Inflate the menu for the CAB
        MenuInflater inflater = mode.getMenuInflater();
        inflater.inflate(R.menu.context, menu);
        return true;
    }

    @Override
    public void onDestroyActionMode(ActionMode mode) {
        // Here you can make any necessary updates to the activity when
        // the CAB is removed. By default, selected items are deselected/unchecked.
    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        // Here you can perform updates to the CAB due to
        // an invalidate() request
        return false;
    }
});

    Hepsi bu kadar. Şimdi kullanıcı ne zaman uzun tıklama ile listeden bir item seçer ise, sistem onCreateActionMode() metodun çağıracak ve tanımlanmış olan işlemler ile birlikte contextual aciton bar görüntülenecektir. Contextual action bar görünür durumda iken kullanıcı diğer itemleri de seçebilecektir.

   Contextual işlemler(actions) sık kullanılan action itemlerini sağladığı bazı durumlarda, kullanıcının itemleri seçmesi için checkbox eklemek veya benzer UI elemanları eklemek isteyebilirsiniz. Çünkü, sık kullanılan bu itemler uzun tıklama sonucu çoğu zaman görünmeyebilir. Kullanıcı checkbox'ı seçtiği zaman, setItemChecked() metodu ile işaretlenmiş durumlarını sıralı list itemlere göre ayarlayarak contextual action modu çağırabilirsiniz.

Soru ve Görüşleriniz için: AndroidVeJava

9 Şubat 2015 Pazartesi

Android - Menu Kavramı Kişisel View'ler için Contextual Action Modu Aktif Etmek - 5

23:49

Kişisel View'ler İçin Contextual Action Mode

   
Orijinal Döküman

Sadece kullanıcının seçtiği özel view'ler için contextual action mod çağırmak için aşağıdaki işlemleri yapmalısınız;

  • ActionMode.Callback metodunu uygularsınız. Bu dönüş metodunda contextual action bar için, actions itemlere tıklandığında verilecek cevap işlemlerini belirleyebilir ve action mod için diğer lifecycle eventleri işleme alabilirsiniz.
  • Action bar'ı görüntülemek isterseniz startActionMode() metodunu çağırmalısınız.(örneğin kullanıcı uzun süreli tıklama olayını gerçekleştirirse)

Örneğin:

1. ActionMode.Callback metodunu arayüze uyguluyoruz.


private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {

    // Called when the action mode is created; startActionMode() was called
    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        // Inflate a menu resource providing context menu items
        MenuInflater inflater = mode.getMenuInflater();
        inflater.inflate(R.menu.context_menu, menu);
        return true;
    }

    // Called each time the action mode is shown. Always called after onCreateActionMode, but
    // may be called multiple times if the mode is invalidated.
    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return false; // Return false if nothing is done
    }

    // Called when the user selects a contextual menu item
    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_share:
                shareCurrentItem();
                mode.finish(); // Action picked, so close the CAB
                return true;
            default:
                return false;
        }
    }

    // Called when the user exits the action mode
    @Override
    public void onDestroyActionMode(ActionMode mode) {
        mActionMode = null;
    }
};

    Bu eylem geri dönüş metotların her biri olay ile ilişkili ActionMode nesnesine parametre geçirmesi dışında neredeyse OptionsMenu geri dönüş metotları ile benzerdirler. ActionMode API kullanarak CAB'da, setTitle() ve setSubtitle() metotları yardımıyla başlık ve alt başlıkları gibi çeşitli değişiklikleri gerçekleştirebilirsiniz.( ne kadar item seçildiğini göstermek için kullanışlı bir araçtır)


2. startActionMode() metodunu çağırarak contextual action modu uygun olduğu anda, örneğin View'e uzun süreli tıklanma gerçekleşmesi gibi durumlarda aktif edebilirsiniz.


someView.setOnLongClickListener(new View.OnLongClickListener() {
// Called when the user long-clicks on someView
public boolean onLongClick(View view) {
        if (mActionMode != null) {
        return false;
        }

        // Start the CAB using the ActionMode.Callback defined above
        mActionMode = getActivity().startActionMode(mActionModeCallback);
        view.setSelected(true);
        return true;
        }
        });



    startActionMode() metodunu çağırdığınızda, sistem oluşturulmuş olan ActionMode'a döner. Bu dönüşü üye değişkene aktarırken, diğer olaylara (eventlere) cevap verildiğinde contextual action bar'da değişiklik yapabilirsiniz. Yukarıdaki ActionMode örneğinde, AcitonMode örneği hali hazırda oluşturulmuş ise üyenin null değere sahip olup olmadığını kontrol ederek yeniden oluşturulmadığından emin olmak için kullanılmıştır.

8 Şubat 2015 Pazar

Android - Menu Kavramı Context Menu Oluşturmak - 4

22:56

Context Menü (İçeriğe has menü ) Oluşturmak

Orijinal Döküman

    Menü kavramına giriş yaptığımız yazımızda kısaca değindiğimiz Context Menu kavramını bu bölümde daha detaylı olarak ele alacağız. Ben de sizler gibi bu konuyu en iyi öğrenebileceğim kaynak olan Developer.android.com adresini gün içinde defalarca ziyaret ederek hem kendim, hem de sizlerin bu kaynağın Türkçeleştirilmiş hâline erişerek bu işi öğrenmemizi amaçladığımı da tekrardan buradan aktarmak isterim.

     Contextual Menü, UI içindeki Context Frame veya belirli itemleri etkileyecek menü işlemleri sağlar. Herhangi bir View için Contextual Menü tanımlaması yapabilirsiniz ama, bu özellik sıklıkla kullanıcının her bir item için doğrudan işlem yapabileceği ListView ve GridView ya da diğer view koleksiyonları için kullanılır. 


    Contextual işlemleri sağlamak için 2 yöntem vardır. Bunlar;

  • Floating Context Menü: Menü, kullanıcının uzun süreli dokunmaları sonucu diyaloglar ile benzer şekilde floating list menü şeklinde görünür. Kullanıcılar aynı anda sadece bir item için contextual işlem gerçekleştirebilir.
  • Contextual Action Mode: Bu mod, ekranın üst kısmında seçili itemlerin etkileneceği işlem listesini görüntüleyen contextual action bar bir ActionMode uygulamasıdır. Bu mod aktif olduğunda (uygulamanız izin veriyorsa) aynı anda birden fazla seçili olan menü itemi için işlem yapılmasını sağlar.
NOT: Contextual Action Mod Android 3.0 ve daha yeni sürümler için sağlanır ve contextual actions gösterimi için tercih edilen bir tekniktir. Android 3.0'dan daha eski sürümler için bir uygulama geliştiriyorsanız, floating contextual menü özelliğini tercih etmeniz gerekir.


Floating Contextual Menü Oluşturmak

    Floating Context Menü oluşturmak için, 

  1. registerForContextMenu() metodu aracılığıyla ilişkilendirilmiş Context Menü View'ini Register edip ardından bunun View'e geçirmelisiniz. Aktivitiniz ListView veya GridView seçeneklerinden birini kullanıyorsanız ve her itemin aynı context menüyü sağlamasını istiyorsanız, Context Menü için tüm itemleri register edip ListView veya GridView'leri  registerForContextMenu() 'ye parametre olarak geçmelisiniz.
  2. onCreateContextMenu() metodunu Aktivitinize veya Fragment'inize uygulayın. Register edilen view'ler uzun-tıklama olayını aldıklarında, sistem onCreateContextMenu() metodu sistem tarafından çağrılır. Bu metot her zaman menu resource'nin inflate edildiği ve menü itemlerinin tanımlandığı yerdir.

Örnek Kod:

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

    MenuInflater size, menu resource'de tanımlı olan context menüyü ekranda gösterme imkânı sağlar. Geri dönüş metodu parametreleri Context Menü'de yer alan ve kullanıcını seçtiği View'leri içerir. ContextMenuInfo nesnesi, seçili menü itemleri hakkında ek bilgiler sağlar. Eğer aktivitiniz'de yer alan viewlerın her biri farklı context menü sağlıyorsa, hangi context menü'nün gösterileceğine (inflate) karar verebilmek için bu parametreleri kullanmalısınız.

    3. onContextItemSelected() metodunu uygulayın ( implemente edin). Kullanıcı menü itemini seçtiğinde, belirlemiş olduğunuz uygun işlemi gerçekleştirmek için sistem bu metodu çağıracaktır.


Örnek Kod:

   @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
        switch (item.getItemId()) {
            case R.id.edit:
                editNote(info.id);
                return true;
            case R.id.delete:
                deleteNote(info.id);
                return true;
            default:
                return super.onContextItemSelected(item);
        }
    }

     getItemId() metodu, XML menü resource'de "android:id" niteliği ile belirlemiş olduğunuz ve seçilmiş olan menü itemi için benzersiz olan ID'yi sorgular. Menü itemi başarı ile ele aldığınızda, dönüş değeri true olur. Menü itemi ele alamadığımızda ise menü itemleri superclass implementetion'a geçirmelisiniz. Aktivitiniz fragment içeriyorsa, bu geri dönüşü ilk olarak aktiviti alır. Ele alınmadığı durumda superclass çağırdığımızda, herhangi bir anda true ya da false değeri dönene kadar sistem olayları her fragment için tek tek geçirir.

     android.app.fragment ve Aktiviti için varsayılan dönüş değeri false'dir, bu nedenle Menü itemi başarılı bir şekilde ele alamadığınızda her zaman superclass metodunu çağırmalısınız.


Contextual Action Mode Aktif Etmek

    Contextual Action Mode, contextual işlemler uygulayan kullanıcı işlemlerine odaklandığı ActionMode'un sistem uygulamasıdır. Kullanıcı, item seçerek bu modu aktif ettiğinde, contextual action bar ekranın üst kısmında görünür ve seçili item için kullanıcının gerçekleştirebileceği işlemleri sunar. Eğer geliştirici olarak izin sağlarsanız bu mod aktif olduğunda, kullanıcı birden fazla item seçmek, bırakmak ve aktiviti ile bunları taşımak (yine sizin müsade ettiğiniz kadarıyla) gibi işlemleri yapabilir. Action mode pasif olduğunda ve contextual action bar, kullanıcı seçmiş olduğu itmeleri bıraktığında veya BACK butona tıkladığında veya bar'ın sol tarafında yer alan Done işlemini seçtiğinde yukarıda kaybolur. 

     NOT: Contextual Action Bar, action bar ile ilişkilendirilmiş olmak zorunda değildir. Bu iki birim, contextual action bar, action barın üzerine gelse de birbirinden bağımsız çalışmaktadır.


     Eğer Android 3.0 ve daha yeni sürümler için geliştirme yapıyorsanız, floating contextual menü yerine her zaman contextual işlemler için contextual action mod'u kullanmalısınız. 

     Contextual Actions sağlayan view'ler için, contextual action mod'u aşağıdaki durumlardan biri veya her ikisi için çağırmalısınız.
  • Kullanıcı View'e uzun süre tıklama işlemini gerçekleştirirse.
  • Kullanıcı View içerisinde check box'a veya benzer bir UI bileşenin işaretlerse.

    Uygulamanızın contextual action mod'u nasıl çağıracağı ve her bir işlem için nasıl davranacağı sizin tasarımınıza bağlıdır. Temel olarak iki tasarım vardır:

  • Kişisel, isteğe bağlı viewlerin contextual işlemleri için,
  • ListView veya GridView içinde yer alan item gruplarında contextual işlemler yığını için.           (kullanıcının birden fazla item seçmesine izin verip, tamamı için tek bir işlem yapmasını sağlamak için)

    Bir sonraki Yazımızda ise her bir senaryo için gerekli düzenlemeleri tanımlamaktadır.

Görüşmek üzere..

Soru Ve Görüşlerinizi için: JavaVeAndroid




Android - Menu Kavramı Options Menu Oluşturmak - 3

20:25

Options Menu Oluşturmak

Orijinal Döküman

   Options Menu, ekranda görüntülenen activity içeriği ile (Search-Arama, Compose Mail-Mail Oluştur,Settings-Ayarlar gibi) alakalı işlemler ve diğer seçenekleri içeren menüyü ifade eder. 
    Option Menu'de yer alan itemler, hangi platformda geliştirme yaptığınız ile ilgili olarak ekranda görünüm yeri değişiklik gösterebilir:

  • Android 2.3 ve daha eski sürümler için geliştirme yapıyorsanız, options menünüze ait içerikler ekranın alt kısmında Menu butonuna basıldığında görünecektir. İlk görünme anında, seçeneklere ait ikonların yer aldığı kısım görünür. Eğer 6 dan fazla item tanımlanmış olan bir menünüz var ise, Android sistemi 6. menü simgesi yerine overflow ikonu görüntüler ve geri kalan itemler overflow menü olarak kullanıcı More ikonuna tıkladığında görünür.

Android 2.3 ve daha eski sürümlerde Options Menu

  • Android 3.0 ve üzeri için uygulama geliştirdiğiniz de, options menu için tanımladığınız itemler action bar'da görüntülenir. Varsayılan olarak, sistem tüm actiondaki itemleri overflow olarak konumlandırır. Kullanıcı ekranın sol üst kısmında yer alan overflow ikona tıklayarak veya eğer varsa Menü butona tıkladığında bu itemler görünür. Önemli işlemlere hızlı erişime imkan tanımak için, <item> elemanı içerisinde android:showAsAction="ifRoom" niteliğini ekleyerek bir kaç itemi actionbar'da görünebilir yapabilirsiniz.


Honeycomb (Android 3.0) galerisinden, Action Bar görünümü

    Options Menü için aktivitinizin subclass'ından veya bir Fragment subclass'dan item deklare edebilirsiniz. Eğer aktiviti ve fragment subclass'larınızın her ikiside options menu için item tanımlıyorsa, bunlar UI'de kombine edilir. Aktiviti itemleri ilk görünür ve ardından fragmentlerin aktivitiye eklenme sırasıyla oluşan sıralama ile her bir fragment için menü görüntülenmesi birbirini takip eder. Gerekli görülürse menu itemlerini android:orderInCategory niteliği ile yeniden sıralayabilirsiniz.

    Bir aktiviti için options menu tanımlamak için, onCreateOptionsMenu() Override(Fragmentler kendi onCreateOptionsMenu() geri dönüş metotlarına sahiptir.) edilir. Bu yöntemde, XML ile tanımlanmış menu resourcenizi geri dönüş metodunda sağlanan Menu içinde inflate edebilirisiniz.
    

Örnek Kod: Bu kod bloğu Android Stüdyo ile veya diğer Android IDE'lerde otomatik oluşturulur.

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

     add() metodu yardımıyla menu itemleri ekleyebilir ve bu itemlere findItem() ile erişip bu itemlerin özelliklerini revize edebilirsiniz. Bunu yapmak için MenuItem API'yi kullanmanız gerekir.
   
     Android 2.3 ve daha eski sürümler için uygulama geliştiriyorsanız, sistem kullanıcının ilk defa menüye erişmesi durumunda options menüyü oluşturmak için onCreateOptionsMenu() çağırır. Eğer Android 3.0 ve daha yeni sürümler için geliştirme yaptığınızda ise, aktiviti başlatıldığı anda onCreateOptionsMenu() metodu sistem tarafından çağırılır ve sıralarına göre menü itemleri action bar'da gösterilmeye başlanır.

Tıklama Olaylarını Ele Almak


    Kullanıcı Options menu'den bir item seçtiği zaman, (action bar'daki action itemler dahil), sistem aktivitinizdeki onOptionsItemSelected() metodunu çağırır. Bu metot seçili MenuItem'i parametre olarak alır. Menu itemler için benzersiz ID'leri döndüren getItemId() metodunu çağırarak( menu resource içinde"android:id" niteliği ile veya add() metodu ile verilen int değerler) menü itemlerini belirleyebilirsiniz. Edinilen bu ID'ler ile bilinen menü itemlerini eşleştirerek uygun işlemi gerçekleştirebilirsiniz.


Örnek Kod:

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
            case R.id.new_game:
                newGame();
                return true;
            case R.id.help:
                showHelp();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }


    Eğer menu itemi başarılı bir şekilde ele alabilirseniz true değeri döndürülür, aksi durumda onOptionsItemSelected() metodu superclass ile implemente edilir. ( varsayılan dönüş değeri false'dir)

    Aktivitinizde fragmentler var ise, sistem ilk olarak aktiviti için ardından da her aktiviti için onOptionsItemSelected() metodunu true döndürene kadar veya tüm fragmentler çağırılana kadar çalıştırılır.(fragmentler her zaman olduğu gibi eklenme sırasıyla işleme alınır)
     Tavsiye:
     Android 3.0 XML'de tanımlanan menu itemleri için on-click davranış tanımlamasını android:onClick niteliği ile tanımlama yeteneğini sizin için sağlıyor. Nitelik için belirlenen isim değeri aktiviti içinde tanımlanan metot ile aynı isimde olmalıdır. Bu metot public olmalı ve sistem bu metodu çağırdığında sadece MenuItem parametresini almalıdır. Menü seçildiğinde bu parametre alınmalıdır. Daha fazla bilgi için Menu Resource kaynağı incelenebilir.

     Tavsiye:

    Eğer uygulamanız birden fazla aktiviti içeriyor ve bu aktivitilerin bazıları aynı Options menüyü kullanıyorsa, onCreateOptionsMenu() ve onItemSeleceted() dışında hiç bir şey içermeyen bir aktiviti oluşturmayı düşünebilirsiniz. Ardından aynı menüyü kullanmayı düşündüğünüz aktivitileri bu sınıftan türeterek aynı Options menüyü paylaşmış olursunuz. Bu yöntem ile, menü işlemlerini ele alan bir kod setini ve oluşturulan bu class'ın soyundan miras alınan her menü davranışını yönetme yeteneği kazanırsınız. Eğer aktiviti soyunda yer alan herhangi bir aktiviti için menu itemi eklemek isterseniz, bu aktiviti içindeki onCreateOptionsMenu() metodunu override etmelisiniz. super.onCreateOptionsMenu(menu) metoduna çağrı yaptığınızda, menu.add() ile eklenmiş olan menu itemler yerine orijinal oluşturulan menü itemleri getirilir. Tabii ki tam tersi durum yani, super calss davranışlarını override ederek kişisel menü itemlerinizi kullanmakta mümkündür.

Çalışma Zamanında Menü İtemlerini Değiştirme

     onCreateOptionsMenu() sistem tarafından çağırıldıktan sonra, doldurmak istediğiniz bu Menu örneğini korur ve onCreateOptionsMenu() metodunu bazı nedenlerden dolayı menu geçersiz olmadıkça da çağırmaz. Fakat, ilk menü durumunu oluştururken ve aktiviti lifecycle'de değişiklik yapmak istemediğinizde onCreateOptionsMenu() metodunu kullanmalısınız.
    Aktiviti lifecycle sırasında meydana gelen olayları temel alarak Options Menu'de değişiklik yapmak isterseniz, onPrepareOptionsMenu() metodunu kullanabilirsiniz. Bu metot size (add-eklemek, remove-silmek veya menu itemlerini disable-pasif etmek gibi) varolan Menu Nesnelerini sağlar ve bunları değiştirme (modify) imkanı verir.(Fragmentler içinde bu metot sağlanır.)

    Android 2.3 ve daha eski sürümler için sistem onPrepareOptionsMenu() metodunu, kullanıcı her Menu butonuna tıklayıp Options Menu'yu açtığında tekrar tekrar çağırır.

    Android 3.0 ve daha yeni sürümleri için menü itemleri action bar'da sunulduğu andan itibaren sürekli açık olarak düşünülebilir. Bir olay gerçekleştiğinde ve menüyü güncellemek için invalidateOptionsMenu() metoduna istekte bulunduğunuzda sistem onPrepareOptionsMenu() metodunu çağırır.


     NOT: Mevcut ekranda görülen View temelli Options Menülerde itemleri asla değiştirmemelisiniz. Kullanıcının trackball veya d-pad kullanmadığı In-Touch modunda viewler dikkat çekmez, bu nedenle options menüde yer alan itemleri değiştirmek için odaklanmayı teme olarak asla kullanmamalısınız. View'ler için Context Menü hassasiyetine sahip menü itemleri tanımlanmak istiyorsanız Context Menu'yü kullanmalısınız.

Bir Sonraki bölümde ise Context Menu'leri ve Bu meüleri oluşturmayı inceleyeceğiz. 
Soru ve Görüşleriniz için : AndroidVeJava


Android - Menü Kavramı XML ile Menü Tanımlama - 2

15:03

Android - Menü Kavramı -2 

Orijinal Döküman


XML ile Menü Tanımlama

    Tüm menü türleri için Android, menu itemleri tanımlarken aktiviti kodunuzda menü tanımlamak yerine standart XML formatını kullanma imkanı sağlar. Bu yöntem ile XML içindeki menu resourceler ile menu ve menuye ait tüm itemleri buradan tanımlamanız kod yazarken size büyük kolaylıklar sağlar. Bu şekilde tanımlanan menu kaynaklarını Menu nesnesinden inflate özelliğini kullanarak aktivitinizde veya fragmentinizide bu menüleri görüntüleyebilirsiniz.

    Menu Resource kullanmak aşağıdaki faydalardan dolayı tercih edilir.

  • XML de menu yapısını görüntülemek ve yapılandırmak daha kolaydır.
  • Menunüz için tanımladığınız içeriği, uygulama kodunuzdan ayırır.
  • Farklı platform sürümleri, ekran boyutları ve diğer düzenlemeler için alternatif menü tanımlamaları yapmanızı sağlar.
    Menu tanımlamak için, projeniz içerisindeki res/menu dizini içerisinde XML dosyası oluşturmalı ve aşağıdaki elemanlar ile menü oluşturmalısınız.

  • <menu></menu> Menu tanımlaması bu etiketler arasında yapılır. Menu dosyamız için bu etiket kök olmak zorundadır. Bu etiket bir veya daha fazla <item> ve <group> elemanı tutabilir.

  • <item></item> Menu içindeki her bir itemi, MenuItem'ler oluşturur. Bu eleman, alt menüler oluşturmak için iç içe <menu> elemanı içerebilir.

  • <group></group>  <item> elemanı için opsiyonel görünmez bir containerdir. Menu itemlerini kategorize etme imkanı verir. Bu yöntem ile aktif durum ve görünürlük gibi bilgileri paylaşır.
game_menu.xml adında menu örneğimiz.

<?xml version ="1.0 encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item 
    
    android:id="@+id/new_game"
    android:icon="@drawable/ic_new_game"
    android:title="@string/new_game"
    android:showAsAction="ifRoom"/>
<item 

   android:id="@+id/help"
   android:icon="@drawable/ic_help"
   android:title="@string/help"/>
</menu>


<item> elemanı, tanımladığınız itemin görünüşü ve davranışını özelleştirmek için kullanabileceğiniz bir kaç nitelik sağlar. Bunlardan bazılar yukarıda kullanılmıştır.

android:id:
   
    İtem için benzersiz bir ID tanımlanır. Bu id yardımıyla uygulama kodu içerisinden bu iteme erişim sağlanır.

android:icon:

    Bu item için kullanmak istediğimi icon u gösterir.

android:title:

    İtem başlığı için kullandığımız referans.

android:showAsAction:

    İtemlerin action bar'da ne zaman ve nasıl görüneceğini tanımlar.


    Bu niteliklerin yanı sıra çok sayıda özellik vardır, fakat bunlar kullanmanız gereken en önemli niteliklerdir. Men Resource dökümanını inceleyerek diğer nitelikler için daha fazla bilgi alabilirsiniz.

    <item> elemanına alt birim olarak <menu> elemanı eklemesiyle dilediğiniz menu iteme bir alt menü ekleyebilirsiniz. Alt Menüler (SubMenu), uygulamanızın çok sayıda fonksiyon içerdiği durumlarda çok kullanışlı bir özellik olduğunu görebilirsiniz. Bu özellik ile menüleri, bilgisayarlarımızda yer alan menüler gibi (File,Edit,View...) tek bir başlık altında toplayarak organize edebiliriz. 


Örnek:

<?xml version="1.0" encodin="utf-8"?>
<menu 
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item 
    android:id="@+id/file"
    android:title="@string/file"

<!-- " file" alt menu"--!>

    <menu>

           <item 
               android:id="@+id/create_new"
               android:title="@string/create_new"/>
           <item
               android:id="@+id/open"
               android:title="@string/open"/>
    </menu>
</item>
</menu>

Aktivitnizde menu kullanmak için menu kaynağını, MenuInflater.inflate() metodu ile ( XML kaynağını, programlanabilir nesneye dönüştürmek) inflate etmeniz gerekir. Bir sonraki bölümde, her hangi bir menü türü için bu menüleri nasıl inflate edeceğimizi göreceğiz.

Soru ve Görüşleriniz için : JavaVeAndroid

Android- Menu Kavramı - 1

13:35

Android - Menu Kavramı -1  

Orijinal Döküman
    Menuler bir çok uygulama türü içerisinde sıklıklar karşılaştığımız bir UI (User Interface) bileşenidir. Aktivitinizde alışılmış ve tutarlı bir kullanıcı deneyimi sağlamak için, MENU API kullanarak uygulamanız için seçenekler ve diğer kullanıcı işlemleri sunabilirsiniz.

    Android 3.0 ile başlayarak, Android yüklü cihazlarda özel konumlandırılmış Menu buttonuna daha fazla ihtiyaç kalmamaktadır. Bu değişim ile, geleneksel 6- item içeren menu panele sahip cihazlara bağlı olmaktan kurtularak tüm platformlardan erişilebilir uygulamalar geliştirmenin yanı sıra, ortak kullanıcı işlemleri için Action Bar seçeneği sunar.

     Bazı menu itemler için kullanıcı deneyimleri ve tasarımlar değişse de, işlem seti ve seçenekler ile ilgili söz dizimler hala Menu API ile tanımlanmaktadır. Bu içerik ile üç temel menü türünü ya da tüm Android sürümleri için işlem tanımlamasının nasıl yapıldığını anlatmaktadır.


Options Menu ve Action Bar

    Options Menu bir aktiviti için birincil menu ürünleri koleksiyonudur. Uygulamanız için genel olarak tanımlayacağınız menü işlemleri ( "Arama-Search","Mail Oluştur-Compose Mail","Ayarlar-Settings") konumlayacağınız yerdir.

    Android 2.3 ve daha eski sürümler için geliştirme yapıyorsanız, options menü kullanıcı tarafından Menu düğmesine basıldığı anda görülecektir. 
    Android 3.0 ve üzeri platformlar için ise options menü son-screen işlemler ve overflow işlemlerin kombinasyonu olarak action bar şeklinde sağlanmaktadır. Android 3.0 ile başlayarak Menu button kullanılmasına gerek kalmıyor. Böylece action bar kullanarak işlemlere ve diğer seçeneklere erişim sağlayıp bu yetenekleri diğer tüm platformlara rahatlıkla taşıyabiliriz.

On-Screen : Action Bar kısmında gösterilen menü itemlerini ifade eder.
Overflow   : 3 nokta ile tanımlanan ve tıklandığında diğer menü itemlerin görüntülendiği kısımdır.                         Overflow kelime anlamı ile taşmayı ifade ettiğinden bu kısım için uygun bir ifadedir.


Context Menu ve Contextual Action 

    Context Menu (İçeriksel Menü) kullanıcının herhangi bir iteme uzun sürekli tıklayıp kalması ile ortaya çıkan floating menüdür. Bu menü ile, seçilmiş olan item ile ilgili veya Context Frama ile alakalı işlemler penceresi açar.

    Android 3.0 ve üzeri için geliştirme yaptığımızda, floating menu yerine contextual action mode özelliğini aktif etmeniz gerekir. Bu mod ile item seçildiğinde yapılmasını istediğim seçeneklerin ekranın üst kısmında (action bar kısmı) belirmesi sağlanır ve kullanıcıya birden fazla item seçme imkanı verir.



Floating Context Menu (Solda) Contextual Action Mode ( Sağda)

Pop-Up Menu

    Bir Pop-up menü, menüde View ile ilişkilendirilmiş dikey bir liste halinde items listesi görüntüler. Bu yöntem, tanımlı içerik ile ilgili taşan (overflow) işlemleri göstermek için veya komutun ikinci kısmı için seçenek sunmak için iyi bir araçtır. Pop-up menüdeki işlemler, ilişkilendirilmiş içerikleri doğrudan etkilememelidir.(Bu Contextual Actions ne için var olduğunu açıklar). Aslında pop-up menü activitinizdeki içerik bölgeleri ile ilgili genişletilmiş işlemleri görüntüler. Contextual Actions dan ayrıldığı nokta budur.

Bir sonraki bölümde XML ile Menu tanımlaması yapacağız..

Soru ve Görüşleriniz için: AndroidVeJava







Menü Kavramı etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Menü Kavramı etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

14 Şubat 2015 Cumartesi

Intent Tabanlı Menü İtemleri Eklemek


    Bazı durumlarda seçilen menü itemi aracılığıyla Intent(Bu başlığı daha detaylı ele alacağız) kullanarak bir activity veya başka bir uygulama açmak isteyebilirsiniz. Belirli menü itemi için kullanmak istediğiniz intenti (niyet, maksat) biliyorsanız, uygun item seçildiğinde ilgili callback(geri dönüş) metoduyla startActivity() metoduyla intent başlatabilirsiniz.

    Eğer intent işlemini başlatacak olan uygulamayı kullanıcının cihazındaki içeriğe göre belirlemezseniz, bu intenti çağıracak menü itemi eklemek fonksiyonel olmayan bir menü işlemiyle sonuçlanır. Çünkü, Inten bir Activity'i çözümlemek olmayabilir. Bu sorunu çözmek için, Android Intent'in işleme alabileceği aktiviteler bulduğunda dinamik olarak menü itemlerini ekleme imkânı tanır.

    Menü itemi eklemek, kabul edilen bir intent için müsait olan aktiviteleri temel alır.

  1. Intent tanımını CATEGORY_ALTERNATIVE ve/veya CATEGORY_SELECTED_ALTERNATIVE şeklinde, diğer gereklilikleri de ekleyerek yapınız.
  2. Menu.addIntentOptions() metodunu çağırın. Android böylece uygulamaları tarayacak ve intenti işleyip menüye ekleyecektir.
     Intent ile uyumlu bir uygulama yüklü bulunmadıysa eğer, herhangi bir menü itemi eklenmeyecektir.


    ÖRNEK:

@Override
    public boolean onCreateOptionsMenu(Menu menu){
        super.onCreateOptionsMenu(menu);

        // Create an Intent that describes the requirements to fulfill, to be included
        // in our menu. The offering app must include a category value of Intent.CATEGORY_ALTERNATIVE.
        Intent intent = new Intent(null, dataUri);
        intent.addCategory(Intent.CATEGORY_ALTERNATIVE);

        // Search and populate the menu with acceptable offering applications.
        menu.addIntentOptions(
                R.id.menu_archive,  // Menu group to which new items will be added
                0,      // Unique item ID (none)
                0,      // Order for the items (none)
                this.getComponentName(),   // The current activity name
                null,   // Specific items to place first (none)
                intent, // Intent created above that describes our requirements
                0,      // Additional flags to control items (none)
                null);  // Array of MenuItems that correlate to specific items (none)

        return true;
    }


     Menü item başlığını ve menü item iconunu android:label değeri belirleyerek intent filtreleme yaptığımızda her tanımlı menü aktivitesi için tanımlı bir intent sağlanır. addIntentOptions() metodu, eklenmiş menü itemi sayısını döndürür.

NOT: addIntentOptions() metodunu çağırdığınızda, ilk argüman ile tanımlanmış gruplanmış tüm menü itemlerini Override eder.


Aktivitinizin diğer Menülere eklenmesine izin vermek


    Aktivitinizin servislerini diğer uygulamalara da teklif edebilirsiniz. Böylece uygulamanız diğer uygulamaların menülerinde de yer alabilir. Bu düzenlemeleri AndroidManifest.xml de yapmanız gerekiyor.

    Diğer uygulama menülerinde yer alabilmek için, bilindik şekilde bir intent filter yapmanız lazım ve bu tanımlamayı yaparken, CATEGORY_ALTERNATIVE ve/veya CATEGORY_SELECTED_ALTERNATIVE değerlerini intent filter kategorisi için tanımladığınızdan emin olmalısınız.

ÖRNEK:

<intent-filter label="@string/resize_image">
    ...
    <category android:name="android.intent.category.ALTERNATIVE" />
    <category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
    ...</intent-filter>

Intenler hakkında daha fazla bilgi için Buradan

Soru Ve Görüşleriniz için : AndroidVeJava

Android - Menu Kavramı Menü Grubu Oluşturmak - 8

Menü Grubu Oluşturmak

    Menü grubu ifadesi, belirli davranışları paylaşan menü itemlerinden oluşan grupları ifade eder. Gruop ile ;


  • setGroupVisible() metoduyla tüm itemleri Show(göster) veya Hide(gizle) edebilirsiniz.
  • setGroupEnabled() metoduyla tüm itemleri aktif veya pasif edebilirsiniz.
  • setGroupCheckable() metoduyla tüm itemlerin seçilip seçilmeyeceğine karar verebilirsiniz.

    Gruplama işlemini menu resource içinde <item> elementi altında <group> etiketi altında veya add() metodu ile grup ID tanımlayarak kodlayabilirsiniz. 

Aşağıda menü grubu içeren menu resource örneğini görebilirsiniz.


Örnek:

<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">

    <item android:id="@+id/action_settings"
        android:title="@string/action_settings"
        android:orderInCategory="100" app:showAsAction="never"/>


        <item android:id="@+id/menu_save"
            android:icon="@drawable/menu_save"
            android:title="@string/menu_save" />
        <!-- menu group -->
        <group android:id="@+id/group_delete">
            <item android:id="@+id/menu_archive"
                android:title="@string/menu_archive" />
            <item android:id="@+id/menu_delete"
                android:title="@string/menu_delete" />
        </group>

</menu>


    Grup içindeki itemler, ilk iteml ile aynı düzeyde görünecektir.(Menü'deki tüm bu üç item özdeşlerdir. Tabii ki, yukarıda bahsedilen metotlar yardımıyla group ID vererek grup içindeki iki itemin davranışlarını değiştirebilirsiniz.) Sistem gruplamış  olduğunuz itemleri asla ayırmayacaktır. örnek olarak; her itemi android:showAsAction="ifRoom" ile tanımlarsanız, bu itemler ya action bar'da ya da action overflow'da görünecektir.


Checkable Menü İtemlerini kullanmak 

    On/Off gibi iki seçeneğe sahip menü tasarımlarında kullanabileceğiniz kullanışı bir yetenektir. Aşağıdaki şekilde örnek bir gösterim yer almaktadır.

    android:checkAbleBehaviour niteliği aşağıdaki özellikleri taşıyabilir.

  •  single Grup içindeki sadece bir itemin seçilebilir olmasını istediğimizde,
  • all Tüm itemlerin seçilebilir olmasını istediğimizde,
  • none Hiç bir iteme bu özelliği vermek istemediğimizde.


    android:checked niteliğini kullanarak varsayılan olarak seçili gelmesini istediğiniz itemleri <item> elementi içinde belirleyip ardından kod satırında setChecked() bu metod içinde de işlemleri yapabilirsiniz.


    Seçilebilir item tıklandığında, sistem onOptionsItemSelected() metodu gibi sırasıyla tanımlamış olduğunuz geri dönüş metotlarını çağırır. Bu alanlarda checkbox durumunu ayarlamanız gerekir, çünkü checkbox veya radio butonlar durumlarını otomatik olarak değiştirmezler. Yani sizin XML'de yapmış olduğunuz tanım java dosyasında da tanımlanmalı ve Selected şeklinde belirtilmelidir. İtemlerin mevcut durumlarını, isChecked() metodu ile kontrol edebilir, setChecked() metoduyla da seçili duruma getirebilirsiniz.

Örnek:

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_archive:
            case R.id.menu_delete:
                if (item.isChecked()) item.setChecked(false);
                else item.setChecked(true);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }


    Bu şekilde seçili durumu ayarlamazsanız, itemin görünür durumu kullanıcı bu itemi seçtiğinde değişmeyecektir.(checkbox veya radio button). View'in durumunu ayarlarsanız, kullanıcı ayarlamaları yapıp, daha sonra geldiğinde de görünür kıldığınız bu seçimler kullanıcının karşısına gelecektir. 

NOT: Checkable Menü itemleri oturum baslı ve app destroy edildiğinde kayedilmeyen işlemlere yöneliktir. Kullanıcı için ayarları kaydetmek istediğiniz durumda, SharedPreferences kullanarak verileri kayıt etmelisiniz. Bu konuya ileride değineceğiz.

Soru Ve Görüşleriniz için : AndroidVeJava



13 Şubat 2015 Cuma

Android - Menu Kavramı Pop-Up Menü Oluşturmak - 7

Pop-Up Menü Oluşturmak

     Pop-Up menüler, View'ler ile ilişkilendirilmiş tipik menülerdir. Anchor View'ın altında yer olduğunda veya diğer View'lerin üzerinde görünür. Aşağıdaki durumlarda kullanışlı bir seçenektir. Bunlar; 


  • İşlemler için, belirli içerik ile alakalı overflow-stil menü tanımlarken ( Gmail'de email başlığı gibi şekil 1) 

Şekil 1 Gmail app'den Pop-Up Menü Örneği

NOT: Bu yapı, genellikle seçili itemlerin etkilendiği Context Menü ile aynı değildir. Seçili itemleri etkileyen işlemler tayin etmek için, contextual action mode veya floating context menü kullanınız.

  • İkinci kısım komut cümleleri tanımladığınızda( "Add" şeklinde etiketlenmiş ve farklı bir "Add" işlemi için tanımlanmış Pop-Up Menü türetmek gibi )
  • Spinner' e benzer, seçimleri kalıcı olarak tutmayan drop-down(aşağı açılır menü) tanımlarken,

NOT: Pop-Up Menü, diğer bir çok özellik gibi Android 3.0 (API Level 11) ile birlikte geliştirilmiştir. 



    Eğer Pop-Up menünüzü XML içinde tanımlıyorsanız, yapmanız gerekenler aşağıdaki gibidir.

  1. PopupMenu yü, mevcut uygulamanın Pop-Up menüyle ilişkilendirilecek Context ve View'lerini parametre alacak şekilde  kendi yapıcı metodu yardımıyla hazırlayın,
  2. MenuInflater kullanarak, PopupMenu.getMenu() ile döndürülecek olan Menü nesnesindeki menü kaynağınızı inflate edin. API Level 14'ten itibaren, PopupMenu.inflate() kullanılabilir.
  3. PopupMenu.show() metodunu çağırın.

Örneğin; android:onClick niteliğiyle oluşturulmuş Pop-Up Menü gösterimi


XML kodu,

  • layout/activity_menu.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"  tools:context=".MainActivity">

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

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_overflow_holo_dark"
        android:contentDescription="@string/descr_overflow_button"
        android:onClick="showPopup" />

</RelativeLayout>


  • menu/actions.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/new_game"

        android:title="new_game"
        app:showAsAction="ifRoom"/>
    <item android:id="@+id/help"

        android:title="help" />
</menu>

  • Java kodu

public class MainActivity extends ActionBarActivity {

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


    public void showPopup(View v) {
        PopupMenu popup = new PopupMenu(this, v);
        MenuInflater inflater = popup.getMenuInflater();
        inflater.inflate(R.menu.actions, popup.getMenu());
        popup.show();
    }
...



    API Level 14 ve daha yeni sürümlerde, PopupMenu.inflate() metodu yardımıyla, 2 satırı kombine edebilirsiniz.

    Menü, kullanıcını menü alanı dışına tıklamasıyla veya bir item seçmesi ile görevini tamamlar. Bu görevi bitirme (dismissed) olayını, PopupMenu.onDismissListener() metodu ile takip edebilirsiniz.

Pop-Up Menü'de Tıklama Olaylarını Ele Almak


    Kullanıcı Menü itemlerinden birini seçtiğinde işlem gerçekleştirmek için, PopupMenu.onMenuItemListener arayüzünü uygulamalı ve bunu PopupMenu'ye setOnMenuItemclickListener() metodunu çağırarak register etmelisiniz. Kullanıcı herhangi bir item seçtiğinde, uygulamanızın arayüzünden sistem onMenuItemClick() geri dönüş metodunu çağırır. 

Örnek:

---Yukarıda bahsettiğimiz dizinlerde tanımlanan kaynak dosyalarından sadece java dosyasına eklediğimiz . Pop-Up Menü oluşturduğumuz kodun yerine bu kodu ekliyoruz.


 public void showPopup(View v) {
        PopupMenu popup = new PopupMenu(this, v);

        // This activity implements OnMenuItemClickListener
//        popup.setOnMenuItemClickListener();

        popup.inflate(R.menu.actions);
        popup.show();

        popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            public boolean onMenuItemClick(MenuItem item) {
                TextView view1 = (TextView) findViewById(R.id.hello);
                view1.setText("changed by Pop_Up menu");
                return true;
            }

    });
    }


Örnek Kod'un projesi için Buradan..
Soru ve Görüşleriniz için ise AndroidVeJava




Android - Menu Kavramı ListView veya GridView'de Yığın Contextual Actions Aktif Etmek - 6

ListView veya GirdView'de Yığın Contextual Actions Aktif Etmek


    Eğer ListView veya GridView içinde item setiniz var ise ve kullanıcının yığın işlemleri (batch actions) gerçekleştirmesini istiyorsanız şunları yapmalısınız;

  • AbsListView.MultiChoiceModeListener() metodunu arayüze uygulamalı ve bunu setMultiChoiceModeListener() metodu ile view gruba ayarlamalısınız. Listener's dönüş metodunda, contextual action bar için, action itemlere yapılan tıklamalara verilecek cevap işlemleri belirleyebilir ve diğer ActionMode.Callback arayüzünden miras alınan(inherited)dönüş metotlarını işleme alabilirsiniz.
  • setChoiceMode() metodunu CHOICE_MODE_MULTIPLE_MODAL parametresi ile çağırın.

Örnek Kod:



ListView listView = getListView();
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
listView.setMultiChoiceModeListener(new MultiChoiceModeListener() {

    @Override
    public void onItemCheckedStateChanged(ActionMode mode, int position,
                                          long id, boolean checked) {
        // Here you can do something when items are selected/de-selected,
        // such as update the title in the CAB
    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        // Respond to clicks on the actions in the CAB
        switch (item.getItemId()) {
            case R.id.menu_delete:
                deleteSelectedItems();
                mode.finish(); // Action picked, so close the CAB
                return true;
            default:
                return false;
        }
    }

    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        // Inflate the menu for the CAB
        MenuInflater inflater = mode.getMenuInflater();
        inflater.inflate(R.menu.context, menu);
        return true;
    }

    @Override
    public void onDestroyActionMode(ActionMode mode) {
        // Here you can make any necessary updates to the activity when
        // the CAB is removed. By default, selected items are deselected/unchecked.
    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        // Here you can perform updates to the CAB due to
        // an invalidate() request
        return false;
    }
});

    Hepsi bu kadar. Şimdi kullanıcı ne zaman uzun tıklama ile listeden bir item seçer ise, sistem onCreateActionMode() metodun çağıracak ve tanımlanmış olan işlemler ile birlikte contextual aciton bar görüntülenecektir. Contextual action bar görünür durumda iken kullanıcı diğer itemleri de seçebilecektir.

   Contextual işlemler(actions) sık kullanılan action itemlerini sağladığı bazı durumlarda, kullanıcının itemleri seçmesi için checkbox eklemek veya benzer UI elemanları eklemek isteyebilirsiniz. Çünkü, sık kullanılan bu itemler uzun tıklama sonucu çoğu zaman görünmeyebilir. Kullanıcı checkbox'ı seçtiği zaman, setItemChecked() metodu ile işaretlenmiş durumlarını sıralı list itemlere göre ayarlayarak contextual action modu çağırabilirsiniz.

Soru ve Görüşleriniz için: AndroidVeJava

9 Şubat 2015 Pazartesi

Android - Menu Kavramı Kişisel View'ler için Contextual Action Modu Aktif Etmek - 5

Kişisel View'ler İçin Contextual Action Mode

   
Orijinal Döküman

Sadece kullanıcının seçtiği özel view'ler için contextual action mod çağırmak için aşağıdaki işlemleri yapmalısınız;

  • ActionMode.Callback metodunu uygularsınız. Bu dönüş metodunda contextual action bar için, actions itemlere tıklandığında verilecek cevap işlemlerini belirleyebilir ve action mod için diğer lifecycle eventleri işleme alabilirsiniz.
  • Action bar'ı görüntülemek isterseniz startActionMode() metodunu çağırmalısınız.(örneğin kullanıcı uzun süreli tıklama olayını gerçekleştirirse)

Örneğin:

1. ActionMode.Callback metodunu arayüze uyguluyoruz.


private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {

    // Called when the action mode is created; startActionMode() was called
    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        // Inflate a menu resource providing context menu items
        MenuInflater inflater = mode.getMenuInflater();
        inflater.inflate(R.menu.context_menu, menu);
        return true;
    }

    // Called each time the action mode is shown. Always called after onCreateActionMode, but
    // may be called multiple times if the mode is invalidated.
    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return false; // Return false if nothing is done
    }

    // Called when the user selects a contextual menu item
    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_share:
                shareCurrentItem();
                mode.finish(); // Action picked, so close the CAB
                return true;
            default:
                return false;
        }
    }

    // Called when the user exits the action mode
    @Override
    public void onDestroyActionMode(ActionMode mode) {
        mActionMode = null;
    }
};

    Bu eylem geri dönüş metotların her biri olay ile ilişkili ActionMode nesnesine parametre geçirmesi dışında neredeyse OptionsMenu geri dönüş metotları ile benzerdirler. ActionMode API kullanarak CAB'da, setTitle() ve setSubtitle() metotları yardımıyla başlık ve alt başlıkları gibi çeşitli değişiklikleri gerçekleştirebilirsiniz.( ne kadar item seçildiğini göstermek için kullanışlı bir araçtır)


2. startActionMode() metodunu çağırarak contextual action modu uygun olduğu anda, örneğin View'e uzun süreli tıklanma gerçekleşmesi gibi durumlarda aktif edebilirsiniz.


someView.setOnLongClickListener(new View.OnLongClickListener() {
// Called when the user long-clicks on someView
public boolean onLongClick(View view) {
        if (mActionMode != null) {
        return false;
        }

        // Start the CAB using the ActionMode.Callback defined above
        mActionMode = getActivity().startActionMode(mActionModeCallback);
        view.setSelected(true);
        return true;
        }
        });



    startActionMode() metodunu çağırdığınızda, sistem oluşturulmuş olan ActionMode'a döner. Bu dönüşü üye değişkene aktarırken, diğer olaylara (eventlere) cevap verildiğinde contextual action bar'da değişiklik yapabilirsiniz. Yukarıdaki ActionMode örneğinde, AcitonMode örneği hali hazırda oluşturulmuş ise üyenin null değere sahip olup olmadığını kontrol ederek yeniden oluşturulmadığından emin olmak için kullanılmıştır.

8 Şubat 2015 Pazar

Android - Menu Kavramı Context Menu Oluşturmak - 4

Context Menü (İçeriğe has menü ) Oluşturmak

Orijinal Döküman

    Menü kavramına giriş yaptığımız yazımızda kısaca değindiğimiz Context Menu kavramını bu bölümde daha detaylı olarak ele alacağız. Ben de sizler gibi bu konuyu en iyi öğrenebileceğim kaynak olan Developer.android.com adresini gün içinde defalarca ziyaret ederek hem kendim, hem de sizlerin bu kaynağın Türkçeleştirilmiş hâline erişerek bu işi öğrenmemizi amaçladığımı da tekrardan buradan aktarmak isterim.

     Contextual Menü, UI içindeki Context Frame veya belirli itemleri etkileyecek menü işlemleri sağlar. Herhangi bir View için Contextual Menü tanımlaması yapabilirsiniz ama, bu özellik sıklıkla kullanıcının her bir item için doğrudan işlem yapabileceği ListView ve GridView ya da diğer view koleksiyonları için kullanılır. 


    Contextual işlemleri sağlamak için 2 yöntem vardır. Bunlar;

  • Floating Context Menü: Menü, kullanıcının uzun süreli dokunmaları sonucu diyaloglar ile benzer şekilde floating list menü şeklinde görünür. Kullanıcılar aynı anda sadece bir item için contextual işlem gerçekleştirebilir.
  • Contextual Action Mode: Bu mod, ekranın üst kısmında seçili itemlerin etkileneceği işlem listesini görüntüleyen contextual action bar bir ActionMode uygulamasıdır. Bu mod aktif olduğunda (uygulamanız izin veriyorsa) aynı anda birden fazla seçili olan menü itemi için işlem yapılmasını sağlar.
NOT: Contextual Action Mod Android 3.0 ve daha yeni sürümler için sağlanır ve contextual actions gösterimi için tercih edilen bir tekniktir. Android 3.0'dan daha eski sürümler için bir uygulama geliştiriyorsanız, floating contextual menü özelliğini tercih etmeniz gerekir.


Floating Contextual Menü Oluşturmak

    Floating Context Menü oluşturmak için, 

  1. registerForContextMenu() metodu aracılığıyla ilişkilendirilmiş Context Menü View'ini Register edip ardından bunun View'e geçirmelisiniz. Aktivitiniz ListView veya GridView seçeneklerinden birini kullanıyorsanız ve her itemin aynı context menüyü sağlamasını istiyorsanız, Context Menü için tüm itemleri register edip ListView veya GridView'leri  registerForContextMenu() 'ye parametre olarak geçmelisiniz.
  2. onCreateContextMenu() metodunu Aktivitinize veya Fragment'inize uygulayın. Register edilen view'ler uzun-tıklama olayını aldıklarında, sistem onCreateContextMenu() metodu sistem tarafından çağrılır. Bu metot her zaman menu resource'nin inflate edildiği ve menü itemlerinin tanımlandığı yerdir.

Örnek Kod:

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

    MenuInflater size, menu resource'de tanımlı olan context menüyü ekranda gösterme imkânı sağlar. Geri dönüş metodu parametreleri Context Menü'de yer alan ve kullanıcını seçtiği View'leri içerir. ContextMenuInfo nesnesi, seçili menü itemleri hakkında ek bilgiler sağlar. Eğer aktivitiniz'de yer alan viewlerın her biri farklı context menü sağlıyorsa, hangi context menü'nün gösterileceğine (inflate) karar verebilmek için bu parametreleri kullanmalısınız.

    3. onContextItemSelected() metodunu uygulayın ( implemente edin). Kullanıcı menü itemini seçtiğinde, belirlemiş olduğunuz uygun işlemi gerçekleştirmek için sistem bu metodu çağıracaktır.


Örnek Kod:

   @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
        switch (item.getItemId()) {
            case R.id.edit:
                editNote(info.id);
                return true;
            case R.id.delete:
                deleteNote(info.id);
                return true;
            default:
                return super.onContextItemSelected(item);
        }
    }

     getItemId() metodu, XML menü resource'de "android:id" niteliği ile belirlemiş olduğunuz ve seçilmiş olan menü itemi için benzersiz olan ID'yi sorgular. Menü itemi başarı ile ele aldığınızda, dönüş değeri true olur. Menü itemi ele alamadığımızda ise menü itemleri superclass implementetion'a geçirmelisiniz. Aktivitiniz fragment içeriyorsa, bu geri dönüşü ilk olarak aktiviti alır. Ele alınmadığı durumda superclass çağırdığımızda, herhangi bir anda true ya da false değeri dönene kadar sistem olayları her fragment için tek tek geçirir.

     android.app.fragment ve Aktiviti için varsayılan dönüş değeri false'dir, bu nedenle Menü itemi başarılı bir şekilde ele alamadığınızda her zaman superclass metodunu çağırmalısınız.


Contextual Action Mode Aktif Etmek

    Contextual Action Mode, contextual işlemler uygulayan kullanıcı işlemlerine odaklandığı ActionMode'un sistem uygulamasıdır. Kullanıcı, item seçerek bu modu aktif ettiğinde, contextual action bar ekranın üst kısmında görünür ve seçili item için kullanıcının gerçekleştirebileceği işlemleri sunar. Eğer geliştirici olarak izin sağlarsanız bu mod aktif olduğunda, kullanıcı birden fazla item seçmek, bırakmak ve aktiviti ile bunları taşımak (yine sizin müsade ettiğiniz kadarıyla) gibi işlemleri yapabilir. Action mode pasif olduğunda ve contextual action bar, kullanıcı seçmiş olduğu itmeleri bıraktığında veya BACK butona tıkladığında veya bar'ın sol tarafında yer alan Done işlemini seçtiğinde yukarıda kaybolur. 

     NOT: Contextual Action Bar, action bar ile ilişkilendirilmiş olmak zorunda değildir. Bu iki birim, contextual action bar, action barın üzerine gelse de birbirinden bağımsız çalışmaktadır.


     Eğer Android 3.0 ve daha yeni sürümler için geliştirme yapıyorsanız, floating contextual menü yerine her zaman contextual işlemler için contextual action mod'u kullanmalısınız. 

     Contextual Actions sağlayan view'ler için, contextual action mod'u aşağıdaki durumlardan biri veya her ikisi için çağırmalısınız.
  • Kullanıcı View'e uzun süre tıklama işlemini gerçekleştirirse.
  • Kullanıcı View içerisinde check box'a veya benzer bir UI bileşenin işaretlerse.

    Uygulamanızın contextual action mod'u nasıl çağıracağı ve her bir işlem için nasıl davranacağı sizin tasarımınıza bağlıdır. Temel olarak iki tasarım vardır:

  • Kişisel, isteğe bağlı viewlerin contextual işlemleri için,
  • ListView veya GridView içinde yer alan item gruplarında contextual işlemler yığını için.           (kullanıcının birden fazla item seçmesine izin verip, tamamı için tek bir işlem yapmasını sağlamak için)

    Bir sonraki Yazımızda ise her bir senaryo için gerekli düzenlemeleri tanımlamaktadır.

Görüşmek üzere..

Soru Ve Görüşlerinizi için: JavaVeAndroid




Android - Menu Kavramı Options Menu Oluşturmak - 3


Options Menu Oluşturmak

Orijinal Döküman

   Options Menu, ekranda görüntülenen activity içeriği ile (Search-Arama, Compose Mail-Mail Oluştur,Settings-Ayarlar gibi) alakalı işlemler ve diğer seçenekleri içeren menüyü ifade eder. 
    Option Menu'de yer alan itemler, hangi platformda geliştirme yaptığınız ile ilgili olarak ekranda görünüm yeri değişiklik gösterebilir:

  • Android 2.3 ve daha eski sürümler için geliştirme yapıyorsanız, options menünüze ait içerikler ekranın alt kısmında Menu butonuna basıldığında görünecektir. İlk görünme anında, seçeneklere ait ikonların yer aldığı kısım görünür. Eğer 6 dan fazla item tanımlanmış olan bir menünüz var ise, Android sistemi 6. menü simgesi yerine overflow ikonu görüntüler ve geri kalan itemler overflow menü olarak kullanıcı More ikonuna tıkladığında görünür.

Android 2.3 ve daha eski sürümlerde Options Menu

  • Android 3.0 ve üzeri için uygulama geliştirdiğiniz de, options menu için tanımladığınız itemler action bar'da görüntülenir. Varsayılan olarak, sistem tüm actiondaki itemleri overflow olarak konumlandırır. Kullanıcı ekranın sol üst kısmında yer alan overflow ikona tıklayarak veya eğer varsa Menü butona tıkladığında bu itemler görünür. Önemli işlemlere hızlı erişime imkan tanımak için, <item> elemanı içerisinde android:showAsAction="ifRoom" niteliğini ekleyerek bir kaç itemi actionbar'da görünebilir yapabilirsiniz.


Honeycomb (Android 3.0) galerisinden, Action Bar görünümü

    Options Menü için aktivitinizin subclass'ından veya bir Fragment subclass'dan item deklare edebilirsiniz. Eğer aktiviti ve fragment subclass'larınızın her ikiside options menu için item tanımlıyorsa, bunlar UI'de kombine edilir. Aktiviti itemleri ilk görünür ve ardından fragmentlerin aktivitiye eklenme sırasıyla oluşan sıralama ile her bir fragment için menü görüntülenmesi birbirini takip eder. Gerekli görülürse menu itemlerini android:orderInCategory niteliği ile yeniden sıralayabilirsiniz.

    Bir aktiviti için options menu tanımlamak için, onCreateOptionsMenu() Override(Fragmentler kendi onCreateOptionsMenu() geri dönüş metotlarına sahiptir.) edilir. Bu yöntemde, XML ile tanımlanmış menu resourcenizi geri dönüş metodunda sağlanan Menu içinde inflate edebilirisiniz.
    

Örnek Kod: Bu kod bloğu Android Stüdyo ile veya diğer Android IDE'lerde otomatik oluşturulur.

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

     add() metodu yardımıyla menu itemleri ekleyebilir ve bu itemlere findItem() ile erişip bu itemlerin özelliklerini revize edebilirsiniz. Bunu yapmak için MenuItem API'yi kullanmanız gerekir.
   
     Android 2.3 ve daha eski sürümler için uygulama geliştiriyorsanız, sistem kullanıcının ilk defa menüye erişmesi durumunda options menüyü oluşturmak için onCreateOptionsMenu() çağırır. Eğer Android 3.0 ve daha yeni sürümler için geliştirme yaptığınızda ise, aktiviti başlatıldığı anda onCreateOptionsMenu() metodu sistem tarafından çağırılır ve sıralarına göre menü itemleri action bar'da gösterilmeye başlanır.

Tıklama Olaylarını Ele Almak


    Kullanıcı Options menu'den bir item seçtiği zaman, (action bar'daki action itemler dahil), sistem aktivitinizdeki onOptionsItemSelected() metodunu çağırır. Bu metot seçili MenuItem'i parametre olarak alır. Menu itemler için benzersiz ID'leri döndüren getItemId() metodunu çağırarak( menu resource içinde"android:id" niteliği ile veya add() metodu ile verilen int değerler) menü itemlerini belirleyebilirsiniz. Edinilen bu ID'ler ile bilinen menü itemlerini eşleştirerek uygun işlemi gerçekleştirebilirsiniz.


Örnek Kod:

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
            case R.id.new_game:
                newGame();
                return true;
            case R.id.help:
                showHelp();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }


    Eğer menu itemi başarılı bir şekilde ele alabilirseniz true değeri döndürülür, aksi durumda onOptionsItemSelected() metodu superclass ile implemente edilir. ( varsayılan dönüş değeri false'dir)

    Aktivitinizde fragmentler var ise, sistem ilk olarak aktiviti için ardından da her aktiviti için onOptionsItemSelected() metodunu true döndürene kadar veya tüm fragmentler çağırılana kadar çalıştırılır.(fragmentler her zaman olduğu gibi eklenme sırasıyla işleme alınır)
     Tavsiye:
     Android 3.0 XML'de tanımlanan menu itemleri için on-click davranış tanımlamasını android:onClick niteliği ile tanımlama yeteneğini sizin için sağlıyor. Nitelik için belirlenen isim değeri aktiviti içinde tanımlanan metot ile aynı isimde olmalıdır. Bu metot public olmalı ve sistem bu metodu çağırdığında sadece MenuItem parametresini almalıdır. Menü seçildiğinde bu parametre alınmalıdır. Daha fazla bilgi için Menu Resource kaynağı incelenebilir.

     Tavsiye:

    Eğer uygulamanız birden fazla aktiviti içeriyor ve bu aktivitilerin bazıları aynı Options menüyü kullanıyorsa, onCreateOptionsMenu() ve onItemSeleceted() dışında hiç bir şey içermeyen bir aktiviti oluşturmayı düşünebilirsiniz. Ardından aynı menüyü kullanmayı düşündüğünüz aktivitileri bu sınıftan türeterek aynı Options menüyü paylaşmış olursunuz. Bu yöntem ile, menü işlemlerini ele alan bir kod setini ve oluşturulan bu class'ın soyundan miras alınan her menü davranışını yönetme yeteneği kazanırsınız. Eğer aktiviti soyunda yer alan herhangi bir aktiviti için menu itemi eklemek isterseniz, bu aktiviti içindeki onCreateOptionsMenu() metodunu override etmelisiniz. super.onCreateOptionsMenu(menu) metoduna çağrı yaptığınızda, menu.add() ile eklenmiş olan menu itemler yerine orijinal oluşturulan menü itemleri getirilir. Tabii ki tam tersi durum yani, super calss davranışlarını override ederek kişisel menü itemlerinizi kullanmakta mümkündür.

Çalışma Zamanında Menü İtemlerini Değiştirme

     onCreateOptionsMenu() sistem tarafından çağırıldıktan sonra, doldurmak istediğiniz bu Menu örneğini korur ve onCreateOptionsMenu() metodunu bazı nedenlerden dolayı menu geçersiz olmadıkça da çağırmaz. Fakat, ilk menü durumunu oluştururken ve aktiviti lifecycle'de değişiklik yapmak istemediğinizde onCreateOptionsMenu() metodunu kullanmalısınız.
    Aktiviti lifecycle sırasında meydana gelen olayları temel alarak Options Menu'de değişiklik yapmak isterseniz, onPrepareOptionsMenu() metodunu kullanabilirsiniz. Bu metot size (add-eklemek, remove-silmek veya menu itemlerini disable-pasif etmek gibi) varolan Menu Nesnelerini sağlar ve bunları değiştirme (modify) imkanı verir.(Fragmentler içinde bu metot sağlanır.)

    Android 2.3 ve daha eski sürümler için sistem onPrepareOptionsMenu() metodunu, kullanıcı her Menu butonuna tıklayıp Options Menu'yu açtığında tekrar tekrar çağırır.

    Android 3.0 ve daha yeni sürümleri için menü itemleri action bar'da sunulduğu andan itibaren sürekli açık olarak düşünülebilir. Bir olay gerçekleştiğinde ve menüyü güncellemek için invalidateOptionsMenu() metoduna istekte bulunduğunuzda sistem onPrepareOptionsMenu() metodunu çağırır.


     NOT: Mevcut ekranda görülen View temelli Options Menülerde itemleri asla değiştirmemelisiniz. Kullanıcının trackball veya d-pad kullanmadığı In-Touch modunda viewler dikkat çekmez, bu nedenle options menüde yer alan itemleri değiştirmek için odaklanmayı teme olarak asla kullanmamalısınız. View'ler için Context Menü hassasiyetine sahip menü itemleri tanımlanmak istiyorsanız Context Menu'yü kullanmalısınız.

Bir Sonraki bölümde ise Context Menu'leri ve Bu meüleri oluşturmayı inceleyeceğiz. 
Soru ve Görüşleriniz için : AndroidVeJava


Android - Menü Kavramı XML ile Menü Tanımlama - 2


Android - Menü Kavramı -2 

Orijinal Döküman


XML ile Menü Tanımlama

    Tüm menü türleri için Android, menu itemleri tanımlarken aktiviti kodunuzda menü tanımlamak yerine standart XML formatını kullanma imkanı sağlar. Bu yöntem ile XML içindeki menu resourceler ile menu ve menuye ait tüm itemleri buradan tanımlamanız kod yazarken size büyük kolaylıklar sağlar. Bu şekilde tanımlanan menu kaynaklarını Menu nesnesinden inflate özelliğini kullanarak aktivitinizde veya fragmentinizide bu menüleri görüntüleyebilirsiniz.

    Menu Resource kullanmak aşağıdaki faydalardan dolayı tercih edilir.

  • XML de menu yapısını görüntülemek ve yapılandırmak daha kolaydır.
  • Menunüz için tanımladığınız içeriği, uygulama kodunuzdan ayırır.
  • Farklı platform sürümleri, ekran boyutları ve diğer düzenlemeler için alternatif menü tanımlamaları yapmanızı sağlar.
    Menu tanımlamak için, projeniz içerisindeki res/menu dizini içerisinde XML dosyası oluşturmalı ve aşağıdaki elemanlar ile menü oluşturmalısınız.

  • <menu></menu> Menu tanımlaması bu etiketler arasında yapılır. Menu dosyamız için bu etiket kök olmak zorundadır. Bu etiket bir veya daha fazla <item> ve <group> elemanı tutabilir.

  • <item></item> Menu içindeki her bir itemi, MenuItem'ler oluşturur. Bu eleman, alt menüler oluşturmak için iç içe <menu> elemanı içerebilir.

  • <group></group>  <item> elemanı için opsiyonel görünmez bir containerdir. Menu itemlerini kategorize etme imkanı verir. Bu yöntem ile aktif durum ve görünürlük gibi bilgileri paylaşır.
game_menu.xml adında menu örneğimiz.

<?xml version ="1.0 encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item 
    
    android:id="@+id/new_game"
    android:icon="@drawable/ic_new_game"
    android:title="@string/new_game"
    android:showAsAction="ifRoom"/>
<item 

   android:id="@+id/help"
   android:icon="@drawable/ic_help"
   android:title="@string/help"/>
</menu>


<item> elemanı, tanımladığınız itemin görünüşü ve davranışını özelleştirmek için kullanabileceğiniz bir kaç nitelik sağlar. Bunlardan bazılar yukarıda kullanılmıştır.

android:id:
   
    İtem için benzersiz bir ID tanımlanır. Bu id yardımıyla uygulama kodu içerisinden bu iteme erişim sağlanır.

android:icon:

    Bu item için kullanmak istediğimi icon u gösterir.

android:title:

    İtem başlığı için kullandığımız referans.

android:showAsAction:

    İtemlerin action bar'da ne zaman ve nasıl görüneceğini tanımlar.


    Bu niteliklerin yanı sıra çok sayıda özellik vardır, fakat bunlar kullanmanız gereken en önemli niteliklerdir. Men Resource dökümanını inceleyerek diğer nitelikler için daha fazla bilgi alabilirsiniz.

    <item> elemanına alt birim olarak <menu> elemanı eklemesiyle dilediğiniz menu iteme bir alt menü ekleyebilirsiniz. Alt Menüler (SubMenu), uygulamanızın çok sayıda fonksiyon içerdiği durumlarda çok kullanışlı bir özellik olduğunu görebilirsiniz. Bu özellik ile menüleri, bilgisayarlarımızda yer alan menüler gibi (File,Edit,View...) tek bir başlık altında toplayarak organize edebiliriz. 


Örnek:

<?xml version="1.0" encodin="utf-8"?>
<menu 
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item 
    android:id="@+id/file"
    android:title="@string/file"

<!-- " file" alt menu"--!>

    <menu>

           <item 
               android:id="@+id/create_new"
               android:title="@string/create_new"/>
           <item
               android:id="@+id/open"
               android:title="@string/open"/>
    </menu>
</item>
</menu>

Aktivitnizde menu kullanmak için menu kaynağını, MenuInflater.inflate() metodu ile ( XML kaynağını, programlanabilir nesneye dönüştürmek) inflate etmeniz gerekir. Bir sonraki bölümde, her hangi bir menü türü için bu menüleri nasıl inflate edeceğimizi göreceğiz.

Soru ve Görüşleriniz için : JavaVeAndroid

Android- Menu Kavramı - 1


Android - Menu Kavramı -1  

Orijinal Döküman
    Menuler bir çok uygulama türü içerisinde sıklıklar karşılaştığımız bir UI (User Interface) bileşenidir. Aktivitinizde alışılmış ve tutarlı bir kullanıcı deneyimi sağlamak için, MENU API kullanarak uygulamanız için seçenekler ve diğer kullanıcı işlemleri sunabilirsiniz.

    Android 3.0 ile başlayarak, Android yüklü cihazlarda özel konumlandırılmış Menu buttonuna daha fazla ihtiyaç kalmamaktadır. Bu değişim ile, geleneksel 6- item içeren menu panele sahip cihazlara bağlı olmaktan kurtularak tüm platformlardan erişilebilir uygulamalar geliştirmenin yanı sıra, ortak kullanıcı işlemleri için Action Bar seçeneği sunar.

     Bazı menu itemler için kullanıcı deneyimleri ve tasarımlar değişse de, işlem seti ve seçenekler ile ilgili söz dizimler hala Menu API ile tanımlanmaktadır. Bu içerik ile üç temel menü türünü ya da tüm Android sürümleri için işlem tanımlamasının nasıl yapıldığını anlatmaktadır.


Options Menu ve Action Bar

    Options Menu bir aktiviti için birincil menu ürünleri koleksiyonudur. Uygulamanız için genel olarak tanımlayacağınız menü işlemleri ( "Arama-Search","Mail Oluştur-Compose Mail","Ayarlar-Settings") konumlayacağınız yerdir.

    Android 2.3 ve daha eski sürümler için geliştirme yapıyorsanız, options menü kullanıcı tarafından Menu düğmesine basıldığı anda görülecektir. 
    Android 3.0 ve üzeri platformlar için ise options menü son-screen işlemler ve overflow işlemlerin kombinasyonu olarak action bar şeklinde sağlanmaktadır. Android 3.0 ile başlayarak Menu button kullanılmasına gerek kalmıyor. Böylece action bar kullanarak işlemlere ve diğer seçeneklere erişim sağlayıp bu yetenekleri diğer tüm platformlara rahatlıkla taşıyabiliriz.

On-Screen : Action Bar kısmında gösterilen menü itemlerini ifade eder.
Overflow   : 3 nokta ile tanımlanan ve tıklandığında diğer menü itemlerin görüntülendiği kısımdır.                         Overflow kelime anlamı ile taşmayı ifade ettiğinden bu kısım için uygun bir ifadedir.


Context Menu ve Contextual Action 

    Context Menu (İçeriksel Menü) kullanıcının herhangi bir iteme uzun sürekli tıklayıp kalması ile ortaya çıkan floating menüdür. Bu menü ile, seçilmiş olan item ile ilgili veya Context Frama ile alakalı işlemler penceresi açar.

    Android 3.0 ve üzeri için geliştirme yaptığımızda, floating menu yerine contextual action mode özelliğini aktif etmeniz gerekir. Bu mod ile item seçildiğinde yapılmasını istediğim seçeneklerin ekranın üst kısmında (action bar kısmı) belirmesi sağlanır ve kullanıcıya birden fazla item seçme imkanı verir.



Floating Context Menu (Solda) Contextual Action Mode ( Sağda)

Pop-Up Menu

    Bir Pop-up menü, menüde View ile ilişkilendirilmiş dikey bir liste halinde items listesi görüntüler. Bu yöntem, tanımlı içerik ile ilgili taşan (overflow) işlemleri göstermek için veya komutun ikinci kısmı için seçenek sunmak için iyi bir araçtır. Pop-up menüdeki işlemler, ilişkilendirilmiş içerikleri doğrudan etkilememelidir.(Bu Contextual Actions ne için var olduğunu açıklar). Aslında pop-up menü activitinizdeki içerik bölgeleri ile ilgili genişletilmiş işlemleri görüntüler. Contextual Actions dan ayrıldığı nokta budur.

Bir sonraki bölümde XML ile Menu tanımlaması yapacağız..

Soru ve Görüşleriniz için: AndroidVeJava







Menü Kavramı etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Menü Kavramı etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

14 Şubat 2015 Cumartesi

Intent Tabanlı Menü İtemleri Eklemek


    Bazı durumlarda seçilen menü itemi aracılığıyla Intent(Bu başlığı daha detaylı ele alacağız) kullanarak bir activity veya başka bir uygulama açmak isteyebilirsiniz. Belirli menü itemi için kullanmak istediğiniz intenti (niyet, maksat) biliyorsanız, uygun item seçildiğinde ilgili callback(geri dönüş) metoduyla startActivity() metoduyla intent başlatabilirsiniz.

    Eğer intent işlemini başlatacak olan uygulamayı kullanıcının cihazındaki içeriğe göre belirlemezseniz, bu intenti çağıracak menü itemi eklemek fonksiyonel olmayan bir menü işlemiyle sonuçlanır. Çünkü, Inten bir Activity'i çözümlemek olmayabilir. Bu sorunu çözmek için, Android Intent'in işleme alabileceği aktiviteler bulduğunda dinamik olarak menü itemlerini ekleme imkânı tanır.

    Menü itemi eklemek, kabul edilen bir intent için müsait olan aktiviteleri temel alır.

  1. Intent tanımını CATEGORY_ALTERNATIVE ve/veya CATEGORY_SELECTED_ALTERNATIVE şeklinde, diğer gereklilikleri de ekleyerek yapınız.
  2. Menu.addIntentOptions() metodunu çağırın. Android böylece uygulamaları tarayacak ve intenti işleyip menüye ekleyecektir.
     Intent ile uyumlu bir uygulama yüklü bulunmadıysa eğer, herhangi bir menü itemi eklenmeyecektir.


    ÖRNEK:

@Override
    public boolean onCreateOptionsMenu(Menu menu){
        super.onCreateOptionsMenu(menu);

        // Create an Intent that describes the requirements to fulfill, to be included
        // in our menu. The offering app must include a category value of Intent.CATEGORY_ALTERNATIVE.
        Intent intent = new Intent(null, dataUri);
        intent.addCategory(Intent.CATEGORY_ALTERNATIVE);

        // Search and populate the menu with acceptable offering applications.
        menu.addIntentOptions(
                R.id.menu_archive,  // Menu group to which new items will be added
                0,      // Unique item ID (none)
                0,      // Order for the items (none)
                this.getComponentName(),   // The current activity name
                null,   // Specific items to place first (none)
                intent, // Intent created above that describes our requirements
                0,      // Additional flags to control items (none)
                null);  // Array of MenuItems that correlate to specific items (none)

        return true;
    }


     Menü item başlığını ve menü item iconunu android:label değeri belirleyerek intent filtreleme yaptığımızda her tanımlı menü aktivitesi için tanımlı bir intent sağlanır. addIntentOptions() metodu, eklenmiş menü itemi sayısını döndürür.

NOT: addIntentOptions() metodunu çağırdığınızda, ilk argüman ile tanımlanmış gruplanmış tüm menü itemlerini Override eder.


Aktivitinizin diğer Menülere eklenmesine izin vermek


    Aktivitinizin servislerini diğer uygulamalara da teklif edebilirsiniz. Böylece uygulamanız diğer uygulamaların menülerinde de yer alabilir. Bu düzenlemeleri AndroidManifest.xml de yapmanız gerekiyor.

    Diğer uygulama menülerinde yer alabilmek için, bilindik şekilde bir intent filter yapmanız lazım ve bu tanımlamayı yaparken, CATEGORY_ALTERNATIVE ve/veya CATEGORY_SELECTED_ALTERNATIVE değerlerini intent filter kategorisi için tanımladığınızdan emin olmalısınız.

ÖRNEK:

<intent-filter label="@string/resize_image">
    ...
    <category android:name="android.intent.category.ALTERNATIVE" />
    <category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
    ...</intent-filter>

Intenler hakkında daha fazla bilgi için Buradan

Soru Ve Görüşleriniz için : AndroidVeJava

Android - Menu Kavramı Menü Grubu Oluşturmak - 8

Menü Grubu Oluşturmak

    Menü grubu ifadesi, belirli davranışları paylaşan menü itemlerinden oluşan grupları ifade eder. Gruop ile ;


  • setGroupVisible() metoduyla tüm itemleri Show(göster) veya Hide(gizle) edebilirsiniz.
  • setGroupEnabled() metoduyla tüm itemleri aktif veya pasif edebilirsiniz.
  • setGroupCheckable() metoduyla tüm itemlerin seçilip seçilmeyeceğine karar verebilirsiniz.

    Gruplama işlemini menu resource içinde <item> elementi altında <group> etiketi altında veya add() metodu ile grup ID tanımlayarak kodlayabilirsiniz. 

Aşağıda menü grubu içeren menu resource örneğini görebilirsiniz.


Örnek:

<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">

    <item android:id="@+id/action_settings"
        android:title="@string/action_settings"
        android:orderInCategory="100" app:showAsAction="never"/>


        <item android:id="@+id/menu_save"
            android:icon="@drawable/menu_save"
            android:title="@string/menu_save" />
        <!-- menu group -->
        <group android:id="@+id/group_delete">
            <item android:id="@+id/menu_archive"
                android:title="@string/menu_archive" />
            <item android:id="@+id/menu_delete"
                android:title="@string/menu_delete" />
        </group>

</menu>


    Grup içindeki itemler, ilk iteml ile aynı düzeyde görünecektir.(Menü'deki tüm bu üç item özdeşlerdir. Tabii ki, yukarıda bahsedilen metotlar yardımıyla group ID vererek grup içindeki iki itemin davranışlarını değiştirebilirsiniz.) Sistem gruplamış  olduğunuz itemleri asla ayırmayacaktır. örnek olarak; her itemi android:showAsAction="ifRoom" ile tanımlarsanız, bu itemler ya action bar'da ya da action overflow'da görünecektir.


Checkable Menü İtemlerini kullanmak 

    On/Off gibi iki seçeneğe sahip menü tasarımlarında kullanabileceğiniz kullanışı bir yetenektir. Aşağıdaki şekilde örnek bir gösterim yer almaktadır.

    android:checkAbleBehaviour niteliği aşağıdaki özellikleri taşıyabilir.

  •  single Grup içindeki sadece bir itemin seçilebilir olmasını istediğimizde,
  • all Tüm itemlerin seçilebilir olmasını istediğimizde,
  • none Hiç bir iteme bu özelliği vermek istemediğimizde.


    android:checked niteliğini kullanarak varsayılan olarak seçili gelmesini istediğiniz itemleri <item> elementi içinde belirleyip ardından kod satırında setChecked() bu metod içinde de işlemleri yapabilirsiniz.


    Seçilebilir item tıklandığında, sistem onOptionsItemSelected() metodu gibi sırasıyla tanımlamış olduğunuz geri dönüş metotlarını çağırır. Bu alanlarda checkbox durumunu ayarlamanız gerekir, çünkü checkbox veya radio butonlar durumlarını otomatik olarak değiştirmezler. Yani sizin XML'de yapmış olduğunuz tanım java dosyasında da tanımlanmalı ve Selected şeklinde belirtilmelidir. İtemlerin mevcut durumlarını, isChecked() metodu ile kontrol edebilir, setChecked() metoduyla da seçili duruma getirebilirsiniz.

Örnek:

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_archive:
            case R.id.menu_delete:
                if (item.isChecked()) item.setChecked(false);
                else item.setChecked(true);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }


    Bu şekilde seçili durumu ayarlamazsanız, itemin görünür durumu kullanıcı bu itemi seçtiğinde değişmeyecektir.(checkbox veya radio button). View'in durumunu ayarlarsanız, kullanıcı ayarlamaları yapıp, daha sonra geldiğinde de görünür kıldığınız bu seçimler kullanıcının karşısına gelecektir. 

NOT: Checkable Menü itemleri oturum baslı ve app destroy edildiğinde kayedilmeyen işlemlere yöneliktir. Kullanıcı için ayarları kaydetmek istediğiniz durumda, SharedPreferences kullanarak verileri kayıt etmelisiniz. Bu konuya ileride değineceğiz.

Soru Ve Görüşleriniz için : AndroidVeJava



13 Şubat 2015 Cuma

Android - Menu Kavramı Pop-Up Menü Oluşturmak - 7

Pop-Up Menü Oluşturmak

     Pop-Up menüler, View'ler ile ilişkilendirilmiş tipik menülerdir. Anchor View'ın altında yer olduğunda veya diğer View'lerin üzerinde görünür. Aşağıdaki durumlarda kullanışlı bir seçenektir. Bunlar; 


  • İşlemler için, belirli içerik ile alakalı overflow-stil menü tanımlarken ( Gmail'de email başlığı gibi şekil 1) 

Şekil 1 Gmail app'den Pop-Up Menü Örneği

NOT: Bu yapı, genellikle seçili itemlerin etkilendiği Context Menü ile aynı değildir. Seçili itemleri etkileyen işlemler tayin etmek için, contextual action mode veya floating context menü kullanınız.

  • İkinci kısım komut cümleleri tanımladığınızda( "Add" şeklinde etiketlenmiş ve farklı bir "Add" işlemi için tanımlanmış Pop-Up Menü türetmek gibi )
  • Spinner' e benzer, seçimleri kalıcı olarak tutmayan drop-down(aşağı açılır menü) tanımlarken,

NOT: Pop-Up Menü, diğer bir çok özellik gibi Android 3.0 (API Level 11) ile birlikte geliştirilmiştir. 



    Eğer Pop-Up menünüzü XML içinde tanımlıyorsanız, yapmanız gerekenler aşağıdaki gibidir.

  1. PopupMenu yü, mevcut uygulamanın Pop-Up menüyle ilişkilendirilecek Context ve View'lerini parametre alacak şekilde  kendi yapıcı metodu yardımıyla hazırlayın,
  2. MenuInflater kullanarak, PopupMenu.getMenu() ile döndürülecek olan Menü nesnesindeki menü kaynağınızı inflate edin. API Level 14'ten itibaren, PopupMenu.inflate() kullanılabilir.
  3. PopupMenu.show() metodunu çağırın.

Örneğin; android:onClick niteliğiyle oluşturulmuş Pop-Up Menü gösterimi


XML kodu,

  • layout/activity_menu.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"  tools:context=".MainActivity">

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

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_overflow_holo_dark"
        android:contentDescription="@string/descr_overflow_button"
        android:onClick="showPopup" />

</RelativeLayout>


  • menu/actions.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/new_game"

        android:title="new_game"
        app:showAsAction="ifRoom"/>
    <item android:id="@+id/help"

        android:title="help" />
</menu>

  • Java kodu

public class MainActivity extends ActionBarActivity {

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


    public void showPopup(View v) {
        PopupMenu popup = new PopupMenu(this, v);
        MenuInflater inflater = popup.getMenuInflater();
        inflater.inflate(R.menu.actions, popup.getMenu());
        popup.show();
    }
...



    API Level 14 ve daha yeni sürümlerde, PopupMenu.inflate() metodu yardımıyla, 2 satırı kombine edebilirsiniz.

    Menü, kullanıcını menü alanı dışına tıklamasıyla veya bir item seçmesi ile görevini tamamlar. Bu görevi bitirme (dismissed) olayını, PopupMenu.onDismissListener() metodu ile takip edebilirsiniz.

Pop-Up Menü'de Tıklama Olaylarını Ele Almak


    Kullanıcı Menü itemlerinden birini seçtiğinde işlem gerçekleştirmek için, PopupMenu.onMenuItemListener arayüzünü uygulamalı ve bunu PopupMenu'ye setOnMenuItemclickListener() metodunu çağırarak register etmelisiniz. Kullanıcı herhangi bir item seçtiğinde, uygulamanızın arayüzünden sistem onMenuItemClick() geri dönüş metodunu çağırır. 

Örnek:

---Yukarıda bahsettiğimiz dizinlerde tanımlanan kaynak dosyalarından sadece java dosyasına eklediğimiz . Pop-Up Menü oluşturduğumuz kodun yerine bu kodu ekliyoruz.


 public void showPopup(View v) {
        PopupMenu popup = new PopupMenu(this, v);

        // This activity implements OnMenuItemClickListener
//        popup.setOnMenuItemClickListener();

        popup.inflate(R.menu.actions);
        popup.show();

        popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            public boolean onMenuItemClick(MenuItem item) {
                TextView view1 = (TextView) findViewById(R.id.hello);
                view1.setText("changed by Pop_Up menu");
                return true;
            }

    });
    }


Örnek Kod'un projesi için Buradan..
Soru ve Görüşleriniz için ise AndroidVeJava




Android - Menu Kavramı ListView veya GridView'de Yığın Contextual Actions Aktif Etmek - 6

ListView veya GirdView'de Yığın Contextual Actions Aktif Etmek


    Eğer ListView veya GridView içinde item setiniz var ise ve kullanıcının yığın işlemleri (batch actions) gerçekleştirmesini istiyorsanız şunları yapmalısınız;

  • AbsListView.MultiChoiceModeListener() metodunu arayüze uygulamalı ve bunu setMultiChoiceModeListener() metodu ile view gruba ayarlamalısınız. Listener's dönüş metodunda, contextual action bar için, action itemlere yapılan tıklamalara verilecek cevap işlemleri belirleyebilir ve diğer ActionMode.Callback arayüzünden miras alınan(inherited)dönüş metotlarını işleme alabilirsiniz.
  • setChoiceMode() metodunu CHOICE_MODE_MULTIPLE_MODAL parametresi ile çağırın.

Örnek Kod:



ListView listView = getListView();
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
listView.setMultiChoiceModeListener(new MultiChoiceModeListener() {

    @Override
    public void onItemCheckedStateChanged(ActionMode mode, int position,
                                          long id, boolean checked) {
        // Here you can do something when items are selected/de-selected,
        // such as update the title in the CAB
    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        // Respond to clicks on the actions in the CAB
        switch (item.getItemId()) {
            case R.id.menu_delete:
                deleteSelectedItems();
                mode.finish(); // Action picked, so close the CAB
                return true;
            default:
                return false;
        }
    }

    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        // Inflate the menu for the CAB
        MenuInflater inflater = mode.getMenuInflater();
        inflater.inflate(R.menu.context, menu);
        return true;
    }

    @Override
    public void onDestroyActionMode(ActionMode mode) {
        // Here you can make any necessary updates to the activity when
        // the CAB is removed. By default, selected items are deselected/unchecked.
    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        // Here you can perform updates to the CAB due to
        // an invalidate() request
        return false;
    }
});

    Hepsi bu kadar. Şimdi kullanıcı ne zaman uzun tıklama ile listeden bir item seçer ise, sistem onCreateActionMode() metodun çağıracak ve tanımlanmış olan işlemler ile birlikte contextual aciton bar görüntülenecektir. Contextual action bar görünür durumda iken kullanıcı diğer itemleri de seçebilecektir.

   Contextual işlemler(actions) sık kullanılan action itemlerini sağladığı bazı durumlarda, kullanıcının itemleri seçmesi için checkbox eklemek veya benzer UI elemanları eklemek isteyebilirsiniz. Çünkü, sık kullanılan bu itemler uzun tıklama sonucu çoğu zaman görünmeyebilir. Kullanıcı checkbox'ı seçtiği zaman, setItemChecked() metodu ile işaretlenmiş durumlarını sıralı list itemlere göre ayarlayarak contextual action modu çağırabilirsiniz.

Soru ve Görüşleriniz için: AndroidVeJava

9 Şubat 2015 Pazartesi

Android - Menu Kavramı Kişisel View'ler için Contextual Action Modu Aktif Etmek - 5

Kişisel View'ler İçin Contextual Action Mode

   
Orijinal Döküman

Sadece kullanıcının seçtiği özel view'ler için contextual action mod çağırmak için aşağıdaki işlemleri yapmalısınız;

  • ActionMode.Callback metodunu uygularsınız. Bu dönüş metodunda contextual action bar için, actions itemlere tıklandığında verilecek cevap işlemlerini belirleyebilir ve action mod için diğer lifecycle eventleri işleme alabilirsiniz.
  • Action bar'ı görüntülemek isterseniz startActionMode() metodunu çağırmalısınız.(örneğin kullanıcı uzun süreli tıklama olayını gerçekleştirirse)

Örneğin:

1. ActionMode.Callback metodunu arayüze uyguluyoruz.


private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {

    // Called when the action mode is created; startActionMode() was called
    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        // Inflate a menu resource providing context menu items
        MenuInflater inflater = mode.getMenuInflater();
        inflater.inflate(R.menu.context_menu, menu);
        return true;
    }

    // Called each time the action mode is shown. Always called after onCreateActionMode, but
    // may be called multiple times if the mode is invalidated.
    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return false; // Return false if nothing is done
    }

    // Called when the user selects a contextual menu item
    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_share:
                shareCurrentItem();
                mode.finish(); // Action picked, so close the CAB
                return true;
            default:
                return false;
        }
    }

    // Called when the user exits the action mode
    @Override
    public void onDestroyActionMode(ActionMode mode) {
        mActionMode = null;
    }
};

    Bu eylem geri dönüş metotların her biri olay ile ilişkili ActionMode nesnesine parametre geçirmesi dışında neredeyse OptionsMenu geri dönüş metotları ile benzerdirler. ActionMode API kullanarak CAB'da, setTitle() ve setSubtitle() metotları yardımıyla başlık ve alt başlıkları gibi çeşitli değişiklikleri gerçekleştirebilirsiniz.( ne kadar item seçildiğini göstermek için kullanışlı bir araçtır)


2. startActionMode() metodunu çağırarak contextual action modu uygun olduğu anda, örneğin View'e uzun süreli tıklanma gerçekleşmesi gibi durumlarda aktif edebilirsiniz.


someView.setOnLongClickListener(new View.OnLongClickListener() {
// Called when the user long-clicks on someView
public boolean onLongClick(View view) {
        if (mActionMode != null) {
        return false;
        }

        // Start the CAB using the ActionMode.Callback defined above
        mActionMode = getActivity().startActionMode(mActionModeCallback);
        view.setSelected(true);
        return true;
        }
        });



    startActionMode() metodunu çağırdığınızda, sistem oluşturulmuş olan ActionMode'a döner. Bu dönüşü üye değişkene aktarırken, diğer olaylara (eventlere) cevap verildiğinde contextual action bar'da değişiklik yapabilirsiniz. Yukarıdaki ActionMode örneğinde, AcitonMode örneği hali hazırda oluşturulmuş ise üyenin null değere sahip olup olmadığını kontrol ederek yeniden oluşturulmadığından emin olmak için kullanılmıştır.

8 Şubat 2015 Pazar

Android - Menu Kavramı Context Menu Oluşturmak - 4

Context Menü (İçeriğe has menü ) Oluşturmak

Orijinal Döküman

    Menü kavramına giriş yaptığımız yazımızda kısaca değindiğimiz Context Menu kavramını bu bölümde daha detaylı olarak ele alacağız. Ben de sizler gibi bu konuyu en iyi öğrenebileceğim kaynak olan Developer.android.com adresini gün içinde defalarca ziyaret ederek hem kendim, hem de sizlerin bu kaynağın Türkçeleştirilmiş hâline erişerek bu işi öğrenmemizi amaçladığımı da tekrardan buradan aktarmak isterim.

     Contextual Menü, UI içindeki Context Frame veya belirli itemleri etkileyecek menü işlemleri sağlar. Herhangi bir View için Contextual Menü tanımlaması yapabilirsiniz ama, bu özellik sıklıkla kullanıcının her bir item için doğrudan işlem yapabileceği ListView ve GridView ya da diğer view koleksiyonları için kullanılır. 


    Contextual işlemleri sağlamak için 2 yöntem vardır. Bunlar;

  • Floating Context Menü: Menü, kullanıcının uzun süreli dokunmaları sonucu diyaloglar ile benzer şekilde floating list menü şeklinde görünür. Kullanıcılar aynı anda sadece bir item için contextual işlem gerçekleştirebilir.
  • Contextual Action Mode: Bu mod, ekranın üst kısmında seçili itemlerin etkileneceği işlem listesini görüntüleyen contextual action bar bir ActionMode uygulamasıdır. Bu mod aktif olduğunda (uygulamanız izin veriyorsa) aynı anda birden fazla seçili olan menü itemi için işlem yapılmasını sağlar.
NOT: Contextual Action Mod Android 3.0 ve daha yeni sürümler için sağlanır ve contextual actions gösterimi için tercih edilen bir tekniktir. Android 3.0'dan daha eski sürümler için bir uygulama geliştiriyorsanız, floating contextual menü özelliğini tercih etmeniz gerekir.


Floating Contextual Menü Oluşturmak

    Floating Context Menü oluşturmak için, 

  1. registerForContextMenu() metodu aracılığıyla ilişkilendirilmiş Context Menü View'ini Register edip ardından bunun View'e geçirmelisiniz. Aktivitiniz ListView veya GridView seçeneklerinden birini kullanıyorsanız ve her itemin aynı context menüyü sağlamasını istiyorsanız, Context Menü için tüm itemleri register edip ListView veya GridView'leri  registerForContextMenu() 'ye parametre olarak geçmelisiniz.
  2. onCreateContextMenu() metodunu Aktivitinize veya Fragment'inize uygulayın. Register edilen view'ler uzun-tıklama olayını aldıklarında, sistem onCreateContextMenu() metodu sistem tarafından çağrılır. Bu metot her zaman menu resource'nin inflate edildiği ve menü itemlerinin tanımlandığı yerdir.

Örnek Kod:

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

    MenuInflater size, menu resource'de tanımlı olan context menüyü ekranda gösterme imkânı sağlar. Geri dönüş metodu parametreleri Context Menü'de yer alan ve kullanıcını seçtiği View'leri içerir. ContextMenuInfo nesnesi, seçili menü itemleri hakkında ek bilgiler sağlar. Eğer aktivitiniz'de yer alan viewlerın her biri farklı context menü sağlıyorsa, hangi context menü'nün gösterileceğine (inflate) karar verebilmek için bu parametreleri kullanmalısınız.

    3. onContextItemSelected() metodunu uygulayın ( implemente edin). Kullanıcı menü itemini seçtiğinde, belirlemiş olduğunuz uygun işlemi gerçekleştirmek için sistem bu metodu çağıracaktır.


Örnek Kod:

   @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
        switch (item.getItemId()) {
            case R.id.edit:
                editNote(info.id);
                return true;
            case R.id.delete:
                deleteNote(info.id);
                return true;
            default:
                return super.onContextItemSelected(item);
        }
    }

     getItemId() metodu, XML menü resource'de "android:id" niteliği ile belirlemiş olduğunuz ve seçilmiş olan menü itemi için benzersiz olan ID'yi sorgular. Menü itemi başarı ile ele aldığınızda, dönüş değeri true olur. Menü itemi ele alamadığımızda ise menü itemleri superclass implementetion'a geçirmelisiniz. Aktivitiniz fragment içeriyorsa, bu geri dönüşü ilk olarak aktiviti alır. Ele alınmadığı durumda superclass çağırdığımızda, herhangi bir anda true ya da false değeri dönene kadar sistem olayları her fragment için tek tek geçirir.

     android.app.fragment ve Aktiviti için varsayılan dönüş değeri false'dir, bu nedenle Menü itemi başarılı bir şekilde ele alamadığınızda her zaman superclass metodunu çağırmalısınız.


Contextual Action Mode Aktif Etmek

    Contextual Action Mode, contextual işlemler uygulayan kullanıcı işlemlerine odaklandığı ActionMode'un sistem uygulamasıdır. Kullanıcı, item seçerek bu modu aktif ettiğinde, contextual action bar ekranın üst kısmında görünür ve seçili item için kullanıcının gerçekleştirebileceği işlemleri sunar. Eğer geliştirici olarak izin sağlarsanız bu mod aktif olduğunda, kullanıcı birden fazla item seçmek, bırakmak ve aktiviti ile bunları taşımak (yine sizin müsade ettiğiniz kadarıyla) gibi işlemleri yapabilir. Action mode pasif olduğunda ve contextual action bar, kullanıcı seçmiş olduğu itmeleri bıraktığında veya BACK butona tıkladığında veya bar'ın sol tarafında yer alan Done işlemini seçtiğinde yukarıda kaybolur. 

     NOT: Contextual Action Bar, action bar ile ilişkilendirilmiş olmak zorunda değildir. Bu iki birim, contextual action bar, action barın üzerine gelse de birbirinden bağımsız çalışmaktadır.


     Eğer Android 3.0 ve daha yeni sürümler için geliştirme yapıyorsanız, floating contextual menü yerine her zaman contextual işlemler için contextual action mod'u kullanmalısınız. 

     Contextual Actions sağlayan view'ler için, contextual action mod'u aşağıdaki durumlardan biri veya her ikisi için çağırmalısınız.
  • Kullanıcı View'e uzun süre tıklama işlemini gerçekleştirirse.
  • Kullanıcı View içerisinde check box'a veya benzer bir UI bileşenin işaretlerse.

    Uygulamanızın contextual action mod'u nasıl çağıracağı ve her bir işlem için nasıl davranacağı sizin tasarımınıza bağlıdır. Temel olarak iki tasarım vardır:

  • Kişisel, isteğe bağlı viewlerin contextual işlemleri için,
  • ListView veya GridView içinde yer alan item gruplarında contextual işlemler yığını için.           (kullanıcının birden fazla item seçmesine izin verip, tamamı için tek bir işlem yapmasını sağlamak için)

    Bir sonraki Yazımızda ise her bir senaryo için gerekli düzenlemeleri tanımlamaktadır.

Görüşmek üzere..

Soru Ve Görüşlerinizi için: JavaVeAndroid




Android - Menu Kavramı Options Menu Oluşturmak - 3


Options Menu Oluşturmak

Orijinal Döküman

   Options Menu, ekranda görüntülenen activity içeriği ile (Search-Arama, Compose Mail-Mail Oluştur,Settings-Ayarlar gibi) alakalı işlemler ve diğer seçenekleri içeren menüyü ifade eder. 
    Option Menu'de yer alan itemler, hangi platformda geliştirme yaptığınız ile ilgili olarak ekranda görünüm yeri değişiklik gösterebilir:

  • Android 2.3 ve daha eski sürümler için geliştirme yapıyorsanız, options menünüze ait içerikler ekranın alt kısmında Menu butonuna basıldığında görünecektir. İlk görünme anında, seçeneklere ait ikonların yer aldığı kısım görünür. Eğer 6 dan fazla item tanımlanmış olan bir menünüz var ise, Android sistemi 6. menü simgesi yerine overflow ikonu görüntüler ve geri kalan itemler overflow menü olarak kullanıcı More ikonuna tıkladığında görünür.

Android 2.3 ve daha eski sürümlerde Options Menu

  • Android 3.0 ve üzeri için uygulama geliştirdiğiniz de, options menu için tanımladığınız itemler action bar'da görüntülenir. Varsayılan olarak, sistem tüm actiondaki itemleri overflow olarak konumlandırır. Kullanıcı ekranın sol üst kısmında yer alan overflow ikona tıklayarak veya eğer varsa Menü butona tıkladığında bu itemler görünür. Önemli işlemlere hızlı erişime imkan tanımak için, <item> elemanı içerisinde android:showAsAction="ifRoom" niteliğini ekleyerek bir kaç itemi actionbar'da görünebilir yapabilirsiniz.


Honeycomb (Android 3.0) galerisinden, Action Bar görünümü

    Options Menü için aktivitinizin subclass'ından veya bir Fragment subclass'dan item deklare edebilirsiniz. Eğer aktiviti ve fragment subclass'larınızın her ikiside options menu için item tanımlıyorsa, bunlar UI'de kombine edilir. Aktiviti itemleri ilk görünür ve ardından fragmentlerin aktivitiye eklenme sırasıyla oluşan sıralama ile her bir fragment için menü görüntülenmesi birbirini takip eder. Gerekli görülürse menu itemlerini android:orderInCategory niteliği ile yeniden sıralayabilirsiniz.

    Bir aktiviti için options menu tanımlamak için, onCreateOptionsMenu() Override(Fragmentler kendi onCreateOptionsMenu() geri dönüş metotlarına sahiptir.) edilir. Bu yöntemde, XML ile tanımlanmış menu resourcenizi geri dönüş metodunda sağlanan Menu içinde inflate edebilirisiniz.
    

Örnek Kod: Bu kod bloğu Android Stüdyo ile veya diğer Android IDE'lerde otomatik oluşturulur.

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

     add() metodu yardımıyla menu itemleri ekleyebilir ve bu itemlere findItem() ile erişip bu itemlerin özelliklerini revize edebilirsiniz. Bunu yapmak için MenuItem API'yi kullanmanız gerekir.
   
     Android 2.3 ve daha eski sürümler için uygulama geliştiriyorsanız, sistem kullanıcının ilk defa menüye erişmesi durumunda options menüyü oluşturmak için onCreateOptionsMenu() çağırır. Eğer Android 3.0 ve daha yeni sürümler için geliştirme yaptığınızda ise, aktiviti başlatıldığı anda onCreateOptionsMenu() metodu sistem tarafından çağırılır ve sıralarına göre menü itemleri action bar'da gösterilmeye başlanır.

Tıklama Olaylarını Ele Almak


    Kullanıcı Options menu'den bir item seçtiği zaman, (action bar'daki action itemler dahil), sistem aktivitinizdeki onOptionsItemSelected() metodunu çağırır. Bu metot seçili MenuItem'i parametre olarak alır. Menu itemler için benzersiz ID'leri döndüren getItemId() metodunu çağırarak( menu resource içinde"android:id" niteliği ile veya add() metodu ile verilen int değerler) menü itemlerini belirleyebilirsiniz. Edinilen bu ID'ler ile bilinen menü itemlerini eşleştirerek uygun işlemi gerçekleştirebilirsiniz.


Örnek Kod:

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
            case R.id.new_game:
                newGame();
                return true;
            case R.id.help:
                showHelp();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }


    Eğer menu itemi başarılı bir şekilde ele alabilirseniz true değeri döndürülür, aksi durumda onOptionsItemSelected() metodu superclass ile implemente edilir. ( varsayılan dönüş değeri false'dir)

    Aktivitinizde fragmentler var ise, sistem ilk olarak aktiviti için ardından da her aktiviti için onOptionsItemSelected() metodunu true döndürene kadar veya tüm fragmentler çağırılana kadar çalıştırılır.(fragmentler her zaman olduğu gibi eklenme sırasıyla işleme alınır)
     Tavsiye:
     Android 3.0 XML'de tanımlanan menu itemleri için on-click davranış tanımlamasını android:onClick niteliği ile tanımlama yeteneğini sizin için sağlıyor. Nitelik için belirlenen isim değeri aktiviti içinde tanımlanan metot ile aynı isimde olmalıdır. Bu metot public olmalı ve sistem bu metodu çağırdığında sadece MenuItem parametresini almalıdır. Menü seçildiğinde bu parametre alınmalıdır. Daha fazla bilgi için Menu Resource kaynağı incelenebilir.

     Tavsiye:

    Eğer uygulamanız birden fazla aktiviti içeriyor ve bu aktivitilerin bazıları aynı Options menüyü kullanıyorsa, onCreateOptionsMenu() ve onItemSeleceted() dışında hiç bir şey içermeyen bir aktiviti oluşturmayı düşünebilirsiniz. Ardından aynı menüyü kullanmayı düşündüğünüz aktivitileri bu sınıftan türeterek aynı Options menüyü paylaşmış olursunuz. Bu yöntem ile, menü işlemlerini ele alan bir kod setini ve oluşturulan bu class'ın soyundan miras alınan her menü davranışını yönetme yeteneği kazanırsınız. Eğer aktiviti soyunda yer alan herhangi bir aktiviti için menu itemi eklemek isterseniz, bu aktiviti içindeki onCreateOptionsMenu() metodunu override etmelisiniz. super.onCreateOptionsMenu(menu) metoduna çağrı yaptığınızda, menu.add() ile eklenmiş olan menu itemler yerine orijinal oluşturulan menü itemleri getirilir. Tabii ki tam tersi durum yani, super calss davranışlarını override ederek kişisel menü itemlerinizi kullanmakta mümkündür.

Çalışma Zamanında Menü İtemlerini Değiştirme

     onCreateOptionsMenu() sistem tarafından çağırıldıktan sonra, doldurmak istediğiniz bu Menu örneğini korur ve onCreateOptionsMenu() metodunu bazı nedenlerden dolayı menu geçersiz olmadıkça da çağırmaz. Fakat, ilk menü durumunu oluştururken ve aktiviti lifecycle'de değişiklik yapmak istemediğinizde onCreateOptionsMenu() metodunu kullanmalısınız.
    Aktiviti lifecycle sırasında meydana gelen olayları temel alarak Options Menu'de değişiklik yapmak isterseniz, onPrepareOptionsMenu() metodunu kullanabilirsiniz. Bu metot size (add-eklemek, remove-silmek veya menu itemlerini disable-pasif etmek gibi) varolan Menu Nesnelerini sağlar ve bunları değiştirme (modify) imkanı verir.(Fragmentler içinde bu metot sağlanır.)

    Android 2.3 ve daha eski sürümler için sistem onPrepareOptionsMenu() metodunu, kullanıcı her Menu butonuna tıklayıp Options Menu'yu açtığında tekrar tekrar çağırır.

    Android 3.0 ve daha yeni sürümleri için menü itemleri action bar'da sunulduğu andan itibaren sürekli açık olarak düşünülebilir. Bir olay gerçekleştiğinde ve menüyü güncellemek için invalidateOptionsMenu() metoduna istekte bulunduğunuzda sistem onPrepareOptionsMenu() metodunu çağırır.


     NOT: Mevcut ekranda görülen View temelli Options Menülerde itemleri asla değiştirmemelisiniz. Kullanıcının trackball veya d-pad kullanmadığı In-Touch modunda viewler dikkat çekmez, bu nedenle options menüde yer alan itemleri değiştirmek için odaklanmayı teme olarak asla kullanmamalısınız. View'ler için Context Menü hassasiyetine sahip menü itemleri tanımlanmak istiyorsanız Context Menu'yü kullanmalısınız.

Bir Sonraki bölümde ise Context Menu'leri ve Bu meüleri oluşturmayı inceleyeceğiz. 
Soru ve Görüşleriniz için : AndroidVeJava


Android - Menü Kavramı XML ile Menü Tanımlama - 2


Android - Menü Kavramı -2 

Orijinal Döküman


XML ile Menü Tanımlama

    Tüm menü türleri için Android, menu itemleri tanımlarken aktiviti kodunuzda menü tanımlamak yerine standart XML formatını kullanma imkanı sağlar. Bu yöntem ile XML içindeki menu resourceler ile menu ve menuye ait tüm itemleri buradan tanımlamanız kod yazarken size büyük kolaylıklar sağlar. Bu şekilde tanımlanan menu kaynaklarını Menu nesnesinden inflate özelliğini kullanarak aktivitinizde veya fragmentinizide bu menüleri görüntüleyebilirsiniz.

    Menu Resource kullanmak aşağıdaki faydalardan dolayı tercih edilir.

  • XML de menu yapısını görüntülemek ve yapılandırmak daha kolaydır.
  • Menunüz için tanımladığınız içeriği, uygulama kodunuzdan ayırır.
  • Farklı platform sürümleri, ekran boyutları ve diğer düzenlemeler için alternatif menü tanımlamaları yapmanızı sağlar.
    Menu tanımlamak için, projeniz içerisindeki res/menu dizini içerisinde XML dosyası oluşturmalı ve aşağıdaki elemanlar ile menü oluşturmalısınız.

  • <menu></menu> Menu tanımlaması bu etiketler arasında yapılır. Menu dosyamız için bu etiket kök olmak zorundadır. Bu etiket bir veya daha fazla <item> ve <group> elemanı tutabilir.

  • <item></item> Menu içindeki her bir itemi, MenuItem'ler oluşturur. Bu eleman, alt menüler oluşturmak için iç içe <menu> elemanı içerebilir.

  • <group></group>  <item> elemanı için opsiyonel görünmez bir containerdir. Menu itemlerini kategorize etme imkanı verir. Bu yöntem ile aktif durum ve görünürlük gibi bilgileri paylaşır.
game_menu.xml adında menu örneğimiz.

<?xml version ="1.0 encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item 
    
    android:id="@+id/new_game"
    android:icon="@drawable/ic_new_game"
    android:title="@string/new_game"
    android:showAsAction="ifRoom"/>
<item 

   android:id="@+id/help"
   android:icon="@drawable/ic_help"
   android:title="@string/help"/>
</menu>


<item> elemanı, tanımladığınız itemin görünüşü ve davranışını özelleştirmek için kullanabileceğiniz bir kaç nitelik sağlar. Bunlardan bazılar yukarıda kullanılmıştır.

android:id:
   
    İtem için benzersiz bir ID tanımlanır. Bu id yardımıyla uygulama kodu içerisinden bu iteme erişim sağlanır.

android:icon:

    Bu item için kullanmak istediğimi icon u gösterir.

android:title:

    İtem başlığı için kullandığımız referans.

android:showAsAction:

    İtemlerin action bar'da ne zaman ve nasıl görüneceğini tanımlar.


    Bu niteliklerin yanı sıra çok sayıda özellik vardır, fakat bunlar kullanmanız gereken en önemli niteliklerdir. Men Resource dökümanını inceleyerek diğer nitelikler için daha fazla bilgi alabilirsiniz.

    <item> elemanına alt birim olarak <menu> elemanı eklemesiyle dilediğiniz menu iteme bir alt menü ekleyebilirsiniz. Alt Menüler (SubMenu), uygulamanızın çok sayıda fonksiyon içerdiği durumlarda çok kullanışlı bir özellik olduğunu görebilirsiniz. Bu özellik ile menüleri, bilgisayarlarımızda yer alan menüler gibi (File,Edit,View...) tek bir başlık altında toplayarak organize edebiliriz. 


Örnek:

<?xml version="1.0" encodin="utf-8"?>
<menu 
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item 
    android:id="@+id/file"
    android:title="@string/file"

<!-- " file" alt menu"--!>

    <menu>

           <item 
               android:id="@+id/create_new"
               android:title="@string/create_new"/>
           <item
               android:id="@+id/open"
               android:title="@string/open"/>
    </menu>
</item>
</menu>

Aktivitnizde menu kullanmak için menu kaynağını, MenuInflater.inflate() metodu ile ( XML kaynağını, programlanabilir nesneye dönüştürmek) inflate etmeniz gerekir. Bir sonraki bölümde, her hangi bir menü türü için bu menüleri nasıl inflate edeceğimizi göreceğiz.

Soru ve Görüşleriniz için : JavaVeAndroid

Android- Menu Kavramı - 1


Android - Menu Kavramı -1  

Orijinal Döküman
    Menuler bir çok uygulama türü içerisinde sıklıklar karşılaştığımız bir UI (User Interface) bileşenidir. Aktivitinizde alışılmış ve tutarlı bir kullanıcı deneyimi sağlamak için, MENU API kullanarak uygulamanız için seçenekler ve diğer kullanıcı işlemleri sunabilirsiniz.

    Android 3.0 ile başlayarak, Android yüklü cihazlarda özel konumlandırılmış Menu buttonuna daha fazla ihtiyaç kalmamaktadır. Bu değişim ile, geleneksel 6- item içeren menu panele sahip cihazlara bağlı olmaktan kurtularak tüm platformlardan erişilebilir uygulamalar geliştirmenin yanı sıra, ortak kullanıcı işlemleri için Action Bar seçeneği sunar.

     Bazı menu itemler için kullanıcı deneyimleri ve tasarımlar değişse de, işlem seti ve seçenekler ile ilgili söz dizimler hala Menu API ile tanımlanmaktadır. Bu içerik ile üç temel menü türünü ya da tüm Android sürümleri için işlem tanımlamasının nasıl yapıldığını anlatmaktadır.


Options Menu ve Action Bar

    Options Menu bir aktiviti için birincil menu ürünleri koleksiyonudur. Uygulamanız için genel olarak tanımlayacağınız menü işlemleri ( "Arama-Search","Mail Oluştur-Compose Mail","Ayarlar-Settings") konumlayacağınız yerdir.

    Android 2.3 ve daha eski sürümler için geliştirme yapıyorsanız, options menü kullanıcı tarafından Menu düğmesine basıldığı anda görülecektir. 
    Android 3.0 ve üzeri platformlar için ise options menü son-screen işlemler ve overflow işlemlerin kombinasyonu olarak action bar şeklinde sağlanmaktadır. Android 3.0 ile başlayarak Menu button kullanılmasına gerek kalmıyor. Böylece action bar kullanarak işlemlere ve diğer seçeneklere erişim sağlayıp bu yetenekleri diğer tüm platformlara rahatlıkla taşıyabiliriz.

On-Screen : Action Bar kısmında gösterilen menü itemlerini ifade eder.
Overflow   : 3 nokta ile tanımlanan ve tıklandığında diğer menü itemlerin görüntülendiği kısımdır.                         Overflow kelime anlamı ile taşmayı ifade ettiğinden bu kısım için uygun bir ifadedir.


Context Menu ve Contextual Action 

    Context Menu (İçeriksel Menü) kullanıcının herhangi bir iteme uzun sürekli tıklayıp kalması ile ortaya çıkan floating menüdür. Bu menü ile, seçilmiş olan item ile ilgili veya Context Frama ile alakalı işlemler penceresi açar.

    Android 3.0 ve üzeri için geliştirme yaptığımızda, floating menu yerine contextual action mode özelliğini aktif etmeniz gerekir. Bu mod ile item seçildiğinde yapılmasını istediğim seçeneklerin ekranın üst kısmında (action bar kısmı) belirmesi sağlanır ve kullanıcıya birden fazla item seçme imkanı verir.



Floating Context Menu (Solda) Contextual Action Mode ( Sağda)

Pop-Up Menu

    Bir Pop-up menü, menüde View ile ilişkilendirilmiş dikey bir liste halinde items listesi görüntüler. Bu yöntem, tanımlı içerik ile ilgili taşan (overflow) işlemleri göstermek için veya komutun ikinci kısmı için seçenek sunmak için iyi bir araçtır. Pop-up menüdeki işlemler, ilişkilendirilmiş içerikleri doğrudan etkilememelidir.(Bu Contextual Actions ne için var olduğunu açıklar). Aslında pop-up menü activitinizdeki içerik bölgeleri ile ilgili genişletilmiş işlemleri görüntüler. Contextual Actions dan ayrıldığı nokta budur.

Bir sonraki bölümde XML ile Menu tanımlaması yapacağız..

Soru ve Görüşleriniz için: AndroidVeJava