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.
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 bakın.
- İç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 bakın.
- 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.
Ş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
İç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:
- İçerik menüsünün ilişkilendirildiği
View
öğesini kaydedin. aramaregisterForContextMenu()
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 kaydedebilirRecyclerView
öğesiniregisterForContextMenu()
. - Şunu uygulayın:
onCreateContextMenu()
. yöntemindeki talimatları (Activity
veyaFragment
) 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ğiView
ve birContextMenu.ContextMenuInfo
nesne olarak kullanabilirsiniz. Eğer etkinliğiniz, her biri farklı bir içerik menüsü sunan ve bu parametreleri kullanarak şişir. 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
veyafalse
döndürüldü. Varsayılan olarak uygulananActivity
veandroid.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:
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çinActionMode
API'lerini kullanabilirsiniz. Başlık ve alt başlığın gözden geçirilmesi gibisetTitle()
vesetSubtitle()
, Bu, kaç öğe seçildiğini göstermek için yararlıdır.Önceki örnek,
actionMode
değişkenini İşlem modu kaldırıldığındanull
. Bir sonraki adımda nasıl başlatıldığı ve üye değişkeninin etkinliğinize veya olabilir.- 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, sistemActionMode
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 örnekteActionMode
,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
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ü:
- Oluşturucu ile bir
PopupMenu
örneği oluşturun. Bu örnekteki tüm mevcut uygulamaContext
ve Menünün bağlı olduğuView
. - Menü kaynağınızı
MenuInflater
Menu
nesneyi döndüren:PopupMenu.getMenu()
. - Ş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:
- Şunu kullanarak tüm öğeleri gösterin veya gizleyin:
setGroupVisible()
- Şunu kullanarak tüm öğeleri etkinleştirin veya devre dışı bırakın:
setGroupEnabled()
- Tüm öğelerin kontrol edilebilir olup olmadığını belirtmek için
setGroupCheckable()
<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
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:
- Kategoriyle bir amaç tanımlayın
CATEGORY_ALTERNATIVE
. veyaCATEGORY_SELECTED_ALTERNATIVE
, ya da her ikisinin de karşılanması gerekir. - 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.