Menü ekleme

"Oluştur" yöntemini deneyin
Jetpack Compose, Android için önerilen kullanıcı arayüzü araç setidir. Compose'da bileşenleri nasıl ekleyeceğinizi öğrenin.
TopAppBar → 'nı inceleyin.

Menüler, birçok uygulama türünde yaygın bir kullanıcı arayüzü bileşenidir. Alıcı: tanıdık ve tutarlı bir kullanıcı deneyimi sağlamak, Menu API'leri kullanıcı işlemlerini ve diğer seçenekleri etkinliklerinizde sunun.

ziyaret edin.
Taşma menüsü örneğini gösteren resim
Şekil 1. Simgeye dokunulmasıyla tetiklenen bir menü, simgesini tıklayın.

Bu belgede üç temel menü türünün nasıl oluşturulacağı ve tüm Android sürümlerinde işlem sunuları:

Seçenekler menüsü ve uygulama çubuğu
Seçenekler menüsü, bir mağazanın menü öğelerinden oluşan birincil koleksiyonudur. etkinliği'ne dokunun. Burada, dünya çapında etkisi olan işlemleri "Arama", "E-posta oluştur", ve "Ayarlar"ı tıklayın.

Bkz. Seçenekler menüsü oluşturma bölümüne ekleyin.

İçerik menüsü ve bağlamsal işlem modu
İçerik menüsü kayan menüdür Kullanıcı dokunduğunda ve üç temel unsurdan ibarettir. Google seçilen içeriği veya bağlam çerçevesini etkileyen işlemler sağlar.

Bağlamsal işlem modu, kullanıcıların ekranın üst kısmındaki çubukta seçilen içeriği etkiler ve kullanıcı birden fazla öğe seçiyor.

Daha fazla bilgi için İçerik menüsü oluşturma bölümüne ekleyin.

Pop-up menü
Bir pop-up menüsü, şuna bağlı öğelerin dikey bir listesini görüntüler: bir görünüm oluşturabilirsiniz. Çok fazla işlem yapılmasını sağlamak için veya ikinci bölüm için seçenekler sunan oluşturabilirsiniz. Bir pop-up menüsündeki işlemler, açılış sayfasının bağlamsal işlemler de bu bağlamda yapılır. Bunun yerine pop-up menü, içeriklerinizin bulunduğu bölgelerle alakalı genişletilmiş işlemler içindir. yararlı olabilir.

Pop-up menü oluşturma bölümüne bakın.

XML'de menü tanımla

Android, tüm menü türlerinde menüyü tanımlamak için standart bir XML biçimi sağlar öğeler. Etkinliğinizin kodunda bir menü oluşturmak yerine bir menü tanımlayın ve tüm öğelerini bir XML dosyasında menü kaynağı. Şunları yapabilirsiniz: ardından menü kaynağını artırıp Menu olarak yükleyerek etkinliğinizde veya parçanızda.

Bir menü kaynağının kullanılması aşağıdaki nedenlerden dolayı iyi bir uygulamadır:

  • Menü yapısını XML'de görselleştirmek daha kolaydır.
  • Menü içeriğini, uygulamanızın davranışsal içeriklerinden ayırır girin.
  • Farklı platformlar için alternatif menü yapılandırmaları oluşturmanıza olanak tanır. ayarlarını, sürümlerini, ekran boyutlarını ve diğer yapılandırmaları uygulama kaynakları bahsedeceğim.

Menü tanımlamak için projenizin içinde bir XML dosyası oluşturun res/menu/ dizinini oluşturup aşağıdaki menüyü kullanarak menüyü derleyin öğeler:

<menu>
Menü öğeleri için kapsayıcı olan bir Menu tanımlar. CEVAP <menu> öğesi, dosyanın kök düğümü olmalıdır ve bir veya daha fazla <item> ve <group> içerebilir öğeler.
<item>
MenuItem, Bu boyut, menüdeki tek bir öğeyi temsil eder. Bu öğe, iç içe yerleştirilmiş bir <menu> öğesine dokunun.
<group>
<item> için isteğe bağlı, görünmez bir kapsayıcı öğeler. Menü öğelerini kategorilere ayırmanızı sağlar. Böylece, etkin durum ve görünürlük olarak ayarlayın. Daha fazla bilgi için Menü grubu oluşturma bölümü.

Aşağıda game_menu.xml adlı örnek bir menü verilmiştir:

<?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"
          app:showAsAction="ifRoom"/>
    <item android:id="@+id/help"
          android:icon="@drawable/ic_help"
          android:title="@string/help" />
</menu>

<item> öğesi, kullanabileceğiniz çeşitli özellikleri destekler özelliğini kullanabilirsiniz. Önceki menüde yer alan öğeler aşağıdaki özellikleri içerir:

android:id
Öğeye özgü bir kaynak kimliğidir ve uygulamanın aşağıdaki durumlarda öğeyi tanır: kullanıcı tarafından seçilir.
android:icon
Öğenin simgesi olarak kullanılacak bir çekilebilirliğe yapılan referans.
android:title
Öğenin başlığı olarak kullanılacak bir dizeye referanstır.
android:showAsAction
Bu öğenin işlem öğesi olarak ne zaman ve nasıl görüneceğiyle ilgili spesifikasyon görünür.

Bunlar kullandığınız en önemli özellikler olsa da kullanılabilir. Desteklenen tüm özellikler hakkında bilgi için Menü kaynağı belgelerinden faydalanabilirsiniz.

Herhangi bir menüdeki bir öğeye alt menü eklemek için <menu> öğesi, <item> alt öğesi olarak. Alt menüler, uygulamanızda düzenlenebilecek çok sayıda işlev olduğunda kullanışlıdır Örneğin Dosya, Düzenle ve Görüntüle. Aşağıdaki örneğe bakın:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/file"
          android:title="@string/file" >
        <!-- "file" submenu -->
        <menu>
            <item android:id="@+id/create_new"
                  android:title="@string/create_new" />
            <item android:id="@+id/open"
                  android:title="@string/open" />
        </menu>
    </item>
</menu>

Etkinliğinizdeki menüyü kullanmak için menü kaynağını _inflate_ kullanın. XML kaynağını programlanabilir bir nesneye dönüştürmek için MenuInflater.inflate() Aşağıdaki bölümlerde, her menü türü için bir menünün nasıl şişirileceği gösterilmektedir.

Seçenekler menüsü oluştur

Şekil 1'de gösterilen gibi seçenekler menüsüne, Geçerli etkinlik bağlamıyla alakalı işlemleri ve diğer seçenekleri, "Arama", "E-posta oluştur", ve "Ayarlar"ı tıklayın.

Google E-Tablolar uygulamasının uygulama çubuğunu gösteren resim
Şekil 2. Google E-Tablolar uygulamasında işlem taşma düğmesi de dahil olmak üzere çeşitli düğmeler içerir.

Şuradan seçenekler menüsü için öğe tanımlayabilirsiniz: Activity. alt sınıf veya a Fragment alt sınıftır. Hem etkinliğiniz hem de parçalarınız seçenekler menüsünde, öğeler kullanıcı arayüzünde birleştirilir. Etkinlik öğeleri görünür parçacıkların ilk sırayı takip ettiği, sonra her bir parçanın bu kullanıcılar etkinliğe eklenir. Gerekirse menü öğelerini yeniden sıraya sokmak için her birinde android:orderInCategory özelliğini <item> öğeyi taşımanız gerekiyor.

Bir etkinlik için seçenekler menüsünü belirtmek üzere onCreateOptionsMenu() Parçalar, kendi parçalarını sağlar onCreateOptionsMenu(). geri arama. Bu yöntemde menü kaynağınızı şişirebilirsiniz, XML'de tanımlanır, Menu geri arama. Bu, aşağıdaki örnekte gösterilmektedir:

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    val inflater: MenuInflater = menuInflater
    inflater.inflate(R.menu.game_menu, menu)
    return true
}

Java

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.game_menu, menu);
    return true;
}

Menü öğelerini eklemek için add(). ve şununla öğeleri al: findItem() özelliğini MenuItem API ile revize ettiler.

Tıklama etkinliklerini yönetme

Kullanıcı, işlem öğeleri dahil olmak üzere seçenekler menüsünden bir öğe seçtiğinde veya ziyaret ettiğinizde sistem, onOptionsItemSelected(). yöntemidir. Bu yöntem seçilen MenuItem yönteminden geçer. Anahtar kelimelerin öğeyi çağırarak getItemId(), Bu değer, menü öğesi için Menü kaynağında veya bir tam sayı ile android:id özelliği add() yöntemine. Bu kimliği bilinen menüyle eşleştirebilirsiniz öğeleri eklemeniz gerekir.

Kotlin

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    // Handle item selection.
    return when (item.itemId) {
        R.id.new_game -> {
            newGame()
            true
        }
        R.id.help -> {
            showHelp()
            true
        }
        else -> super.onOptionsItemSelected(item)
    }
}

Java

@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);
    }
}

Bir menü öğesini başarılı bir şekilde işlediğinizde true öğesine dönün. Şu durumda: bir uygulama için üst sınıf bir onOptionsItemSelected() Varsayılan uygulama, false (yanlış) değerini alır.

Etkinliğiniz parçalar içeriyorsa sistem önce Etkinlik için onOptionsItemSelected(), ardından her parça için parçaların eklendiği sırayla, biri true veya tüm parçalar çağrılır.

Çalışma zamanında menü öğelerini değiştir

Sistem onCreateOptionsMenu() çağırdıktan sonra bir doldurduğunuz ve çağırmadığınız Menu örneği onCreateOptionsMenu() talimatını tekrar verebilirsiniz. Bununla birlikte, ilk menüyü oluşturmak için yalnızca onCreateOptionsMenu() öğesini kullanın yapmamanız ve etkinlik yaşam döngüsü boyunca değişiklik yapmamanız gerekir.

Seçenekler menüsünü, sırasında gerçekleşen etkinlikleri temel alarak değiştirmek isterseniz bunu aynı zamanda onPrepareOptionsMenu(). yöntemidir. Bu yöntem, Menu nesnesini olduğu haliyle aktarır Böylece, örneğin öğe ekleyerek, kaldırarak veya devre dışı bırakarak üzerinde değişiklik yapabilirsiniz. Parçalar ayrıca onPrepareOptionsMenu(). geri arama.

Menü öğeleri şurada sunulduğunda, seçenekler menüsü her zaman açık kabul edilir: uygulama çubuğunu kullanın. Bir etkinlik meydana geldiğinde menü güncellemesi yapmak istediğinizde invalidateOptionsMenu(). (sistemin onPrepareOptionsMenu() aramasını isteyin).

İçerik menüsü oluşturma

Kayan içerik menüsünü gösteren resim
Şekil 3. Kayan içerik menüsü.

İçeriğe dayalı menü, belirli bir öğeyi veya bağlamı etkileyen işlemler sunar. çerçeve oluşturalım. Herhangi bir görünüm için bir içerik menüsü sağlayabilirsiniz, ancak bunlar en önemli genellikle bir sektördeki RecylerView veya Kullanıcının her biri üzerinde doğrudan işlem yapabileceği diğer görünüm koleksiyonları öğe.

Bağlamsal işlemler iki şekilde sunulur:

  • Kayan içerik menüsünde. Menü açılır menü simgesi, bir iletişim kutusuna benzer şekilde, menü öğelerinin kayan bir listesi olarak Kullanıcı bir dokunuş yapar ve bir bağlamı desteklediğini belirten görünümü basılı tutma tıklayın. Kullanıcılar tek seferde bir öğe üzerinde bağlamsal bir işlem gerçekleştirebilir.
  • Bağlamsal işlem modunda. Bu mod bir sistemdir uygulanması ActionMode. Ekranın üst kısmında bir bağlamsal işlem çubuğu (CAB) görüntüleyen seçilen öğeleri etkileyen işlem öğelerini içeren ekran. Bu modda etkin durumdaysa kullanıcılar aynı anda birden çok öğe üzerinde bir işlem gerçekleştirebilir. uygulaması bunu destekliyor.

Not: İçerik menüsü, öğe kısayollarını ve öğe simgelerini desteklemez.

Kayan içerik menüsü oluşturma

Kayan içerik menüsü sağlamak için aşağıdakileri yapın:

  1. İçerik menüsünün ilişkilendirildiği View öğesini kaydedin. arama registerForContextMenu() View iletiyorum.

    Etkinliğinizde RecyclerView kullanılıyorsa ve her birinin öğesini ekleyerek aynı içerik menüsünü sağlayabilir, tüm öğeleri bir bağlama göre kaydedebilir RecyclerView öğesini registerForContextMenu().

  2. Şunu uygulayın: onCreateContextMenu(). yöntemindeki talimatları (Activity veya Fragment) değiştirebilirsiniz.

    Kayıtlı görünüm bir dokunuş aldığında ve sistem şunu çağırır: onCreateContextMenu() yönteminiz. İşte tanım aşağıdaki gibi bir menü kaynağını şişirerek menü öğelerini zenginleştirir. örnek:

    Kotlin

        override fun onCreateContextMenu(menu: ContextMenu, v: View,
                                menuInfo: ContextMenu.ContextMenuInfo) {
            super.onCreateContextMenu(menu, v, menuInfo)
            val inflater: MenuInflater = menuInflater
            inflater.inflate(R.menu.context_menu, menu)
        }
        

    Java

        @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. bir menü kaynağından içerik menüsünü şişirmenizi sağlar. Geri çağırma yöntemi parametreler kullanıcının seçtiği View ve bir ContextMenu.ContextMenuInfo nesne olarak kullanabilirsiniz. Eğer etkinliğiniz, her biri farklı bir içerik menüsü sunan ve bu parametreleri kullanarak şişir.

  3. Uygulama onContextItemSelected(), aşağıda gösterildiği gibidir. Kullanıcı bir menü öğesi seçtiğinde, sistemi, uygun işlemi gerçekleştirebilmeniz için bu yöntemi çağırır.

    Kotlin

        override fun onContextItemSelected(item: MenuItem): Boolean {
            val info = item.menuInfo as AdapterView.AdapterContextMenuInfo
            return when (item.itemId) {
                R.id.edit -> {
                    editNote(info.id)
                    true
                }
                R.id.delete -> {
                    deleteNote(info.id)
                    true
                }
                else -> super.onContextItemSelected(item)
            }
        }
        

    Java

        @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() yöntemi, seçilen menü öğesinin kimliğini sorgular ve her bir öğe için aşağıdaki örnekte gösterildiği gibi, android:id özelliğini kullanarak XML biçiminde menü öğesi XML'de bir menü tanımlayın.

    Bir menü öğesini başarılı bir şekilde işlediğinizde true öğesine dönün. Eğer menü öğesini siz siz idare etmiyorsanız, menü öğesini üst sınıfa hakkında bilgi edindiniz. Etkinliğiniz parçalar içeriyorsa, etkinlik bu geri aramayı kullanın. Sistem, teslim edilmediğinde üst sınıfı çağırarak etkinliği, her bir parçadaki ilgili geri çağırma yöntemine geçirir. her parçanın eklendiği sırayla, true veya false döndürüldü. Varsayılan olarak uygulanan Activity ve android.app.Fragment toplandı false; bu nedenle, müdahale edilmediğinde üst sınıfı her zaman çağırın.

Bağlamsal işlem modunu kullanma

Bağlamsal işlem modu, aşağıdakileri içeren bir sistem uygulamasıdır: Kullanıcı etkileşimini performans odaklı hale getiren ActionMode bağlamsal işlemler. Kullanıcı bir öğe seçerek bu modu etkinleştirdiğinde ekranın üst kısmında gösterilen bağlamsal işlem çubuğu Kullanıcının seçili öğeler üzerinde gerçekleştirebileceği işlemler. Bu mod etkinken Uygulamanız destekliyorsa kullanıcı birden fazla öğe seçebilir ve öğeler arasından seçim yapabilir ve etkinlikte gezinmeye devam edebilirsiniz. İşlem modu devre dışı Kullanıcı tüm öğelerin seçimini kaldırdığında bağlamsal işlem çubuğu kaybolur. Kullanıcı geri düğmesine veya ekranın sol tarafındaki Bitti işlemine çubuk.

Bağlamsal işlemler sunan görüntülemelerde, genellikle bağlamsal şu iki etkinlikten biri veya her ikisi de gerçekleştiğinde işlem modu:

  • Kullanıcı bir dokunuş yapar ve görünümü basılı tutun.
  • Kullanıcı, görünümdeki bir onay kutusunu veya benzer bir kullanıcı arayüzü bileşenini seçer.

Uygulamanız bağlamsal işlem modunu nasıl çağırır ve her eylemin davranışını tasarımınıza bağlıdır. İki tasarım vardır:

  • Bağımsız, rastgele görünümlerdeki bağlamsal işlemler için.
  • Bir RecyclerView (kullanıcının birden fazla öğe seçmesine ve hepsinde bir işlem yapabiliyorlar.

Aşağıdaki bölümlerde her bir senaryo için gerekli ayarlar açıklanmaktadır.

Bağımsız görünümler için bağlamsal işlem modunu etkinleştirme

İçeriğe dayalı işlem modunu yalnızca kullanıcı seçtiğinde çağırmak istiyorsanız Belirli görünümlerde, aşağıdakileri yapın:

  1. ActionMode.Callback arayüzünü aşağıda gösterildiği gibi uygulayın örneği inceleyelim. Geri çağırma yöntemlerinde, her bir kullanıcının bağlamsal işlem çubuğunda, işlem öğelerinde tıklama etkinliklerine yanıt verme ve işlem modu için diğer yaşam döngüsü olaylarını ele alma.

    Kotlin

        private val actionModeCallback = object : ActionMode.Callback {
            // Called when the action mode is created. startActionMode() is called.
            override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
                // Inflate a menu resource providing context menu items.
                val inflater: MenuInflater = mode.menuInflater
                inflater.inflate(R.menu.context_menu, menu)
                return true
            }
    
            // Called each time the action mode is shown. Always called after
            // onCreateActionMode, and might be called multiple times if the mode
            // is invalidated.
            override fun onPrepareActionMode(mode: ActionMode, menu: Menu): Boolean {
                return false // Return false if nothing is done
            }
    
            // Called when the user selects a contextual menu item.
            override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
                return when (item.itemId) {
                    R.id.menu_share -> {
                        shareCurrentItem()
                        mode.finish() // Action picked, so close the CAB.
                        true
                    }
                    else -> false
                }
            }
    
            // Called when the user exits the action mode.
            override fun onDestroyActionMode(mode: ActionMode) {
                actionMode = null
            }
        }
        

    Java

        private ActionMode.Callback actionModeCallback = new ActionMode.Callback() {
    
            // Called when the action mode is created. startActionMode() is 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, and might 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) {
                actionMode = null;
            }
        };
        

    Bu etkinlik geri çağırmaları, seçenekler menüsünü kullanın, ancak bu menüden hiçbiri etkinlikle ilişkili ActionMode nesnesini de iletir. Etikette çeşitli değişiklikler yapmak için ActionMode API'lerini kullanabilirsiniz. Başlık ve alt başlığın gözden geçirilmesi gibi setTitle() ve setSubtitle(), Bu, kaç öğe seçildiğini göstermek için yararlıdır.

    Önceki örnek, actionMode değişkenini İşlem modu kaldırıldığında null. Bir sonraki adımda nasıl başlatıldığı ve üye değişkeninin etkinliğinize veya olabilir.

  2. Telefonla arama startActionMode(). çubuğu göstermek istediğinizde (örneğin, kullanıcı dokunduğunda ve görünümü basılı tutun.

    Kotlin

        someView.setOnLongClickListener { view ->
            // Called when the user performs a touch & hold on someView.
            when (actionMode) {
                null -> {
                    // Start the CAB using the ActionMode.Callback defined earlier.
                    actionMode = activity?.startActionMode(actionModeCallback)
                    view.isSelected = true
                    true
                }
                else -> false
            }
        }
        

    Java

        someView.setOnLongClickListener(new View.OnLongClickListener() {
            // Called when the user performs a touch & hold on someView.
            public boolean onLongClick(View view) {
                if (actionMode != null) {
                    return false;
                }
    
                // Start the CAB using the ActionMode.Callback defined earlier.
                actionMode = getActivity().startActionMode(actionModeCallback);
                view.setSelected(true);
                return true;
            }
        });
        

    startActionMode() adlı kişiyi çağırdığınızda, sistem ActionMode oluşturuldu. Bunu bir üye değişkenine kaydederek İçeriğe dayalı işlem çubuğunda diğer etkinliklere yanıt olarak değişiklik yapabilir. Yukarıdaki örnekte ActionMode, ActionMode örneği önceden oluşturulduysa yeniden oluşturulmaz etkin, işlemi başlatmadan önce üyenin null olup olmadığını kontrol ederek yatırım yapmanız önemlidir.

Pop-up menü oluştur

Gmail uygulamasındaki pop-up menüyü, sağ üstteki taşma düğmesine sabitlenmiş resim.
Şekil 4. Gmail uygulamasında bir pop-up menü, sağ üst köşedeki taşma düğmesine sabitlenir.

PopupMenu View bağlantılı bir kalıcı menüdür. Sabitlemenin altında görünür bir görünüm oluşturabilirsiniz. Bu rapor, takip etmek için:

  • Şununla ilişkili işlemler için taşma tarzı bir menü sağlayarak Gmail'in e-posta üstbilgileri gibi belirli bir içeriği saklamanız gerekir.
  • Komut cümlesinin ikinci bir bölümünü (ör. işaretli bir düğme) Farklı Ekle seçenekleri içeren bir pop-up menü oluşturan Ekle seçenekleri vardır.
  • Aşağıdakine benzer bir menü sağlayarak Spinner. kalıcı bir seçim tutmayan bir şablondur.

Menünüzü XML'de tanımlarsanız aşağıdakileri nasıl gösterebilirsiniz? pop-up menü:

  1. Oluşturucu ile bir PopupMenu örneği oluşturun. Bu örnekteki tüm mevcut uygulama Context ve Menünün bağlı olduğu View.
  2. Menü kaynağınızıMenuInflater Menu nesneyi döndüren: PopupMenu.getMenu().
  3. Şu numaraya telefon et: PopupMenu.show().

Örneğin, aşağıda bir pop-up menü gösteren düğme verilmiştir:

<ImageButton
    android:id="@+id/dropdown_menu"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:contentDescription="@string/descr_overflow_button"
    android:src="@drawable/arrow_drop_down" />

Ardından etkinlik pop-up menüsünü aşağıdaki şekilde gösterebilir:

Kotlin

findViewById<ImageButton>(R.id.dropdown_menu).setOnClickListener {
    val popup = PopupMenu(this, it)
    val inflater: MenuInflater = popup.menuInflater
    inflater.inflate(R.menu.actions, popup.menu)
    popup.show()
}

Java

findViewById(R.id.dropdown_menu).setOnClickListener(v -> {
    PopupMenu popup = new PopupMenu(this, v);
    popup.getMenuInflater().inflate(R.menu.actions, popup.getMenu());
    popup.show();
});

Kullanıcı bir öğe seçtiğinde veya menünün dışına dokunduğunda menü kapatılır alanı. Kapatma etkinliğini şunları kullanarak dinleyebilirsiniz: PopupMenu.OnDismissListener

Tıklama etkinliklerini yönetme

Kullanıcı bir menü öğesi seçtiğinde bir işlem gerçekleştirmek için, PopupMenu.OnMenuItemClickListener. arayüzünü ve şu numarayı arayarak PopupMenu cihazınıza kaydedin setOnMenuItemclickListener(). Kullanıcı bir öğe seçtiğinde, sistem onMenuItemClick(). bir geri çağırmadır.

Bu, aşağıdaki örnekte gösterilmektedir:

Kotlin

fun showMenu(v: View) {
    PopupMenu(this, v).apply {
        // MainActivity implements OnMenuItemClickListener.
        setOnMenuItemClickListener(this@MainActivity)
        inflate(R.menu.actions)
        show()
    }
}

override fun onMenuItemClick(item: MenuItem): Boolean {
    return when (item.itemId) {
        R.id.archive -> {
            archive(item)
            true
        }
        R.id.delete -> {
            delete(item)
            true
        }
        else -> false
    }
}

Java

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

    // This activity implements OnMenuItemClickListener.
    popup.setOnMenuItemClickListener(this);
    popup.inflate(R.menu.actions);
    popup.show();
}

@Override
public boolean onMenuItemClick(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.archive:
            archive(item);
            return true;
        case R.id.delete:
            delete(item);
            return true;
        default:
            return false;
    }
}

Menü grubu oluşturma

Menü grubu, belirli özellikleri paylaşan menü öğelerinden oluşan bir koleksiyondur. Şununla grubuna eklemek istiyorsanız, aşağıdakileri yapabilirsiniz:

<item> öğelerini iç içe yerleştirerek bir grup oluşturabilirsiniz menü kaynağınızdaki bir <group> öğesini veya add() yöntemidir.

Aşağıda, bir grubu içeren menü kaynağı örneği verilmiştir:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <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>

Grupta bulunan öğeler, ilk başta menüdeki üç öğe de kardeştir. Dilerseniz Grup kimliğini referans alarak ve yöntemlerine göz atın. Ayrıca sistem, gruplandırılmış öğeleri hiçbir zaman ayırmaz. Örneğin, Örneğin, her telefon araması için android:showAsAction="ifRoom" öğesi varsa, her ikisi de işlem çubuğunda görünür veya her ikisi de işlem taşma.

Kontrol edilebilir menü öğeleri kullan

Şekil 5. Şunları içeren bir alt menü: kontrol edilebilir öğelerdir.

Menü, seçenekleri açmak ve kapatmak için arayüz olarak yararlı olabilir. bağımsız seçenekler için onay kutusu veya karşılıklı ilişkili gruplar için radyo düğmeleri özel seçeneklerdir. Şekil 5'te, kontrol edilebilen öğelerin bulunduğu bir alt menü gösterilmektedir radyo düğmeleri.

Tek tek menü öğeleri için kontrol edilebilir davranışı tanımlamak için <item> içindeki android:checkable özelliği öğesi veya android:checkableBehavior içeren bir grubun tamamı için özelliğini <group> öğesine ekleyin. Örneğin, bu menü grubu bir radyo düğmesiyle işaretlenebilir:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:checkableBehavior="single">
        <item android:id="@+id/red"
              android:title="@string/red" />
        <item android:id="@+id/blue"
              android:title="@string/blue" />
    </group>
</menu>

android:checkableBehavior özelliği, takip etmek için:

single
Gruptan yalnızca bir öğe işaretlenebilir. Bu durumda radyo düğmesi düğmelerini kullanın.
all
Tüm öğeler işaretlenebilir. Bunun sonucunda onay kutuları ortaya çıkar.
none
Kontrol edilebilir öğe yok.

Bir öğeye varsayılan olarak işaretli durumu uygulamak için <item> öğesinde android:checked özelliği kodu kullanarak bunu setChecked() yöntemidir.

Kontrol edilebilir bir öğe seçildiğinde, sistem ilgili öğeyi öğe tarafından seçilen geri çağırma yöntemi (ör. onOptionsItemSelected()). Bu, onay kutusu veya radyo düğmesi dolayısıyla onay kutusunun durumunu düğmesi, durumu otomatik olarak değişmez. Mevcut durumu sorgulayabilirsiniz. kullanıcı tarafından seçilmeden önce olduğu gibi, isChecked(). ve ardından, "işaretli" durumunu setChecked() ile ayarlayın. Bu bilginin gösterildiği yer: aşağıdaki örneği inceleyin:

Kotlin

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return when (item.itemId) {
        R.id.vibrate, R.id.dont_vibrate -> {
            item.isChecked = !item.isChecked
            true
        }
        else -> super.onOptionsItemSelected(item)
    }
}

Java

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

İşaretli durumu bu şekilde ayarlamazsanız onay kutusu veya radyo düğmesi, kullanıcı seçtiğinde değişmez. Bunu yaptığınızda durumu ayarladığınızda, etkinlik öğenin işaretlenmiş durumunu korur. Kullanıcı menüyü daha sonra açtığında, ayarladığınız işaretli durum görünür.

Niyete göre menü öğeleri ekleme

Bazen menü öğesinin bir öğeyi kullanarak bir etkinlik başlatmasını Intent, ister uygulamanızdaki ister başka bir uygulamadaki bir etkinlik olsun. Google Takvim widget'ını kullanmak istediğiniz amacı bilmeli ve satın alma işlemini tamamlamaya yoksa amacı müzakere ederken startActivity() öğe üzerinde seçilen uygun geri çağırma yöntemi sırasında onOptionsItemSelected() geri arama.

Ancak, kullanıcının cihazında işlemi gerçekleştirdiğinde sonuca çağrıştıran bir menü öğesi eklemek işlevsel olmayan menü öğesi, çünkü amaç bir etkinliği çözümleyemez. Android, bu sorunu çözmek için aşağıdaki durumlarda menünüze dinamik olarak menü öğeleri eklemenize olanak tanır. Android, cihazda amacınıza uygun etkinlikleri bulur.

Bir amacı kabul eden mevcut etkinliklere dayalı menü öğeleri eklemek için şu:

  1. Kategoriyle bir amaç tanımlayın CATEGORY_ALTERNATIVE. veya CATEGORY_SELECTED_ALTERNATIVE, ya da her ikisinin de karşılanması gerekir.
  2. Telefonla arama Menu.addIntentOptions() Android daha sonra amacı gerçekleştirebilecek uygulamaları arar ve bunları menünüze ekler.

Amacı karşılayan herhangi bir uygulama yüklü değilse menü görünmez öğe eklendi.

Bu, aşağıdaki örnekte gösterilmektedir:

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    super.onCreateOptionsMenu(menu)

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

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

    return true
}

Java

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

    // Create an Intent that describes the requirements to fulfill, to be
    // included in the 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 apps.
    menu.addIntentOptions(
         R.id.intent_group,         // Menu group to which new items are 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 the requirements.
         0,                         // Additional flags to control items (none).
         null);                     // Array of MenuItems that correlate to specific items (none).

    return true;
}

Amaçla eşleşen intent filtresi sağlayan her etkinlik için bir menü öğesi eklenir. Bunun için amaç filtresinin Menü öğesi başlığı olarak android:label ve menü olarak uygulama simgesi öğe simgesine dokunun. addIntentOptions() yöntemi, menü öğeleri eklendi.

Etkinliğinizin diğer menülere eklenmesine izin verme

Etkinliğinize ilişkin hizmetleri diğer uygulamalara sunabilirsiniz. Böylece uygulamanız diğer kullanıcıların menüsünde yer alır. Daha önce açıklanan roller geri alınır.

Diğer uygulama menülerine dahil edilmek için her zamanki gibi bir intent filtresi tanımlayın, ancak CATEGORY_ALTERNATIVE veya Amaç için CATEGORY_SELECTED_ALTERNATIVE değeri veya her ikisi filtre kategorisi. Bu, aşağıdaki örnekte gösterilmektedir:

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

Amaç filtreleri yazma hakkında daha fazla bilgi edinin: Niyetler ve amaç filtreleri hakkında daha fazla bilgi edinin.