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.

android menü tanımlama etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
android menü tanımlama 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



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 - 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 menü tanımlama etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
android menü tanımlama 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



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 - 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 menü tanımlama etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
android menü tanımlama 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



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 - 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