eğitimin ilk ayı. Menüye daha yakından bakalım. Hem eski Android 2.3 cihazlar hem de yeni Android 4.0 telefonlar dikkate alınacaktır.

Seçenekler Menüsü

Menüden sınıf sorumludur. android.view.Menü. Her aktivite bir menü nesnesiyle ilişkilendirilir. Menünün kendisi menü öğelerini içerir (sınıf android.view.MenuItem) ve alt menü (sınıf android.view.SubMenu).

Bir düğmeye bastığınızda Menü eski telefonlarda, etkinliğe eklenmiş bir dizi menü öğesi görünür. Menü simgeler içerebilir. Böyle bir menü (kural olarak) altı öğe içerebilir. Altıdan fazla öğe varsa, genişletilmiş menü kullanılır - bu durumda altıncı öğe yerine öğe görünür Seçenekler(daha fazla). Bu öğeye basıldığında, seçenek seçim menüsünün ana bölümüne sığmayan öğelerin listesini içeren genişletilmiş bir menü gösterilir.

Menü ilk kez açıldığında, Android yöntemi çağırır. onCreateOptionsMenu(), bir nesneyi parametre olarak geçirme Menü. Menüler, bir XML dosyasında kaynak olarak oluşturulabilir veya Ekle().

Standart bir projede, normal bir şablon seçerken, tek noktalı bir menü için zaten bir boşluk var Ayarlar ve menü için bir yöntem çağrısı (bunu zaten biliyorsunuz).

Kaynakları Kullanarak Menü Oluşturma

Kaynaklar aracılığıyla menüyle çalışmayı düşünün. Bir menü oluşturmak için bir XML dosyasında saklanması gereken kaynaklar kullanılır. Dosyanın kendisi klasörde olmalıdır res/menü/ senin projen. Menü şunlardan oluşur: sıradaki maddeler:

Menü öğelerini içerecek menüyü belirtir. eleman dosyanın XML yapısındaki kök öğe olmalıdır ve bir veya daha fazla öğe içerebilir ve Menü öğelerini doğrudan oluşturur. Bu öğe, iç içe geçmiş bir öğeye sahip olabilir bir alt menü oluşturmak için İsteğe bağlı olarak görünmez bir öğe kabı da kullanabilirsiniz. . Bu, bazı efektler elde etmenizi sağlar

Bir oyun için menüyü kullanmaya karar verdiğimizi varsayalım. hadi oluşturalım yeni dosya game_menu.xml:

İki öğeli bir menü oluşturduk. Her öğe aşağıdaki özellikleri içerir:

Android:id Kullanıcı menü öğesini seçtiğinde uygulamanın tanıyabileceği menü öğesinin tanımlayıcısı android:title Menüde görüntülenecek metin

Öğe için başka nitelikler var öğe, örneğin android:icon="@drawable/home" menü öğesinin simgesini de görüntüler ve android:enabled="yanlış" menü öğesini kullanılamaz hale getirmenizi sağlar.

Bağlanmak android:titleYoğunlaştırılmış normal başlık, seçilen menü öğesine "sığmayacak" kadar geniş olduğunda kullanılır.

Bağlanmak android:orderInCategory MenuItems menü öğelerinin görüntülenme sırasını tanımlar.

Menüyü oluştururken string kaynaklarına işaret ettik. @string/new_game ve @string/yardım. Dosyaya yeni satırlar eklemeniz gerekiyor strings.xml:

Yeni oyun Referans

Şimdi menünün görüntüleneceği aktivite sınıfında değişiklik yapmamız gerekiyor. Program, oluşturduğumuz menü kaynağını bir program nesnesine dönüştürmelidir. Bunun için özel bir yöntem var. MenuInflater.inflate()özel bir yöntemle çağrılan geri aramak onCreateOptionsMenu(). Bu yöntem, bir düğmeye basıldığında bir menüyü görüntülemek için tasarlanmıştır. MENÜ cihazda:

@Override public boole değeri onCreateOptionsMenu( menü menüsü) ( MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.game_menu, menu); true döndür; )

Kodu yapıştırdıktan sonra, geliştirme ortamı sizden eksik ad alanlarını içe aktarmanızı isteyecektir.

android.view.Menu'yu içe aktarın; android.view.MenuInflater'ı içe aktar;

Yöntem onCreateOptionsMenu() yöntem, menünün ekranda ilk görünümünü başlatır ve parametre olarak bir Menu nesnesi alır (eski cihazlar için). Menüye bir bağlantı kaydedebilir ve yöntem olduğu sürece kodunuzun herhangi bir yerinde kullanabilirsiniz. onCreateOptionsMenu() bir daha çağrılmayacak. Her zaman bu işleyicinin üst sınıf uygulamasını kullanmalısınız, çünkü gerekirse menüde otomatik olarak ek sistem öğeleri içerir. Yeni cihazlarda, aktivite oluşturulduğunda yöntem çağrılır. Yöntem bir değer döndürmelidir doğru Menüyü ekranda görünür hale getirmek için

Programı başlattıktan sonra düğmesine basın. MENÜ Oluşturulan menüyü görmek için öykünücüde.

Yöntem getMenuInflater() sınıfın bir örneğini döndürür menü şişirici XML'den menü verilerini okumak için kullandığımız .

Gördüğünüz gibi, menü ekranın alt kısmında belirir. Aynı anda toplam altı menü öğesi görüntülenebilir. Daha fazla puan varsa, beş puan artı altıncı nokta görüntülenecektir. Daha, öğelerin geri kalanını görmenizi sağlar. Yeni menü öğelerini test edip ekleyelim.

Önce altı nokta ekleyelim.

Menüye bir madde daha ekleyelim ki yedi tane olsun.

Menü öğelerini seçme

Menü oluşturmayı öğrendik. Ancak, menü öğeleri tıklamalarımıza hiçbir şekilde tepki vermediğinden, şimdiye kadar işe yaramaz. Yöntem, menü öğelerindeki tıklamaları işlemek için kullanılır. onOptionsItemSelected(). Yöntem, kullanıcı tarafından seçilen öğeyi şu şekilde tanır: Menü seçeneği. Artık seçilen öğeyi arayarak belirleyebiliriz. getItemId() menü öğesinin kimliğini döndüren . Operatör aracılığıyla daha fazla değiştirmek gerekli komutları tanımlamak bize kalır:

@Override public boolean onOptionsItemSelected(MenuItem item) ( // Seçilen menü öğesi anahtarı için işlemler (item.getItemId()) ( case R.id.new_game: newGame(); return true; case R.id.help: showHelp( ) ; return true; varsayılan: return super.onOptionsItemSelected(item); ) ) public void newGame() ( edtext.setText("Yeni oyun seçildi"); ) public void showHelp() ( edtext.setText("Yardım seçildi") ; )

Uygulamayı başlatın, menüyü açın ve birinci veya ikinci menü öğesini seçin. Metin kutusunda bir mesaj görünmelidir.

Verilen örnekte getItemId() seçilen menü öğesi için bir kimlik sorar ve XML kaynaklarında belirlediğimiz kimlikler ile switch seçimi deyimi aracılığıyla karşılaştırmaya başlar. Gerekli tanımlayıcı bulunduğunda, verilen menü öğesi için işleyici yürütülür. Program hiçbir şey bulamazsa, ifade yürütülür. varsayılan, bu süper sınıfı döndürür.

Android 3.0'da, özniteliği ekleyebilirsiniz android: onclick menü kaynaklarında ve artık kullanmanıza gerek yok onOptionsItemSelected(). yardım ile android: onclick bir menü öğesi seçerken istediğiniz yöntemi belirleyebilirsiniz.

// menü öğesi özniteliği Android olarak ayarlandı:onClick="onMenuClick" public void onMenuClick(MenuItem item)( edtext.setText("Seçilen kediyi besle"); )

Programlı olarak menü oluşturma

Düşünmek yazılım oluşturma eksiksizlik için menü. Menü öğeleri için birkaç sabit tanımlamamız gerekecek:

// menü öğeleri için tanımlayıcılar private static final int IDM_OPEN = 101; özel statik final int IDM_SAVE = 102; public boolean onCreateOptionsMenu(Menü menüsü) ( // menü öğeleri ekle menu.add(Menu.NONE, IDM_OPEN, Menu.NONE, "Aç"); menu.add(Menu.NONE, IDM_SAVE, Menu.NONE, "Kaydet") ; )

Yöntemde Ekle() dört seçenek vardır:

  • grup tanımlayıcısı - bir menü öğesini bu menüdeki diğer bir grup öğeyle ilişkilendirmenizi sağlar
  • menü öğesi seçimi olay işleyicisi için öğe tanımlayıcısı
  • menüdeki öğenin sırası - menüdeki konumu belirlemenizi sağlar. Varsayılan olarak (Menu.NONE veya 0) öğeler kodda belirtilen sırayla gider
  • başlık - menü öğesinde görüntülenen metin. Bir dize kaynağı kullanabilirsiniz

Yöntem bir nesne döndürür Menü seçeneği, set simgesi, kısayol tuşu vb. gibi ek özellikleri ayarlamak için kullanılabilir.

Simgelerle bir menü oluşturmak istiyorsanız, yöntemi kullanın. setIcon()

Menu.add(Menu.NONE, IDM_OPEN, Menu.NONE, "Aç") .setIcon(R.drawable.icon_menu_open);

Simgelerin yalnızca altı menü öğesine (veya altıdan fazla öğe varsa beşe) eklenebileceğini tekrar hatırlayın.

Yöntem onCreateOptionsMenu menü oluşturulduğunda sistem tarafından yalnızca bir kez çağrılır. Program çalışırken menüyü güncellemeniz gerekirse geri arama yöntemini kullanın. onPrepareOptionsMenu().

Bir menü öğesi seçildiğinde, yöntem çağrılır. onOptionsItemSelected, nesneyi geçen Menü seçeneği- kullanıcı tarafından seçilen menü öğesi. Yöntemi kullanma getItemId seçilen menü öğesinin kimliğini alabilirsiniz. Menü öğesini tanımladıktan sonra, menü seçimi olayını işlemek için kod yazabilirsiniz:

Genel boolean onOptionsItemSelected(MenuItem item) ( switch (item.getItemId()) case IDM_OPEN: return true; case IDM_SAVE: return true; return false; )

Kısayol Tuşları

Ayrıca çeşitli yöntemler kullanarak klavye karakterlerini kullanarak hızlı erişim için kısayol tuşlarını ayarlayabilirsiniz:

  • setAlphabeticShortcut(char) - bir karakter ekler
  • setNumericShortcut(int) - bir sayı ekler
  • setShortcut(char, int) - Bir karakter ve sayı kombinasyonu ekler

Örneğin, setAlphabeticShortcut("q"); kısayol tuşunu ayarlarsanız, menüyü açtığınızda (veya MENU tuşunu basılı tutarken), tuşuna basarak Q bu menü öğesini seçer. Bu kısayol tuşu(veya klavye kısayolu), menü öğesi adının altında görüntülenen bir araç ipucu olarak gösterilecektir. Daha yeni klavyelerde ayrı bir tuş bulunur Ctrl, normal klavyelerde olduğu gibi çalışır.

Kısayol tuşları ayrıca XML aracılığıyla da oluşturulabilir: android:alphabeticKısayol="c".

Tıklamaları etkinlik yöntemiyle halledebilirsiniz onKeyShortcut():

@Override public boolean onKeyShortcut(int keyCode, KeyEvent olayı) ( switch (keyCode) ( case KeyEvent.KEYCODE_R: Toast.makeText(this, "Reply", Toast.LENGTH_SHORT).show(); true döndür; varsayılan: super döndür. onKeyShortcut(keyCode, event); ))

Alt menü oluşturma

Başka bir alt menü dışında herhangi bir menüye alt menü eklenebilir. Alt menü, geri arama yönteminde oluşturulur onCreateOptionsMenu() yöntemi kullanmak addSubMenu() hangi bir nesne döndürür alt menü. itiraz etmek alt menü yöntemini kullanarak bu menüye ek öğeler ekleyebilirsiniz. Ekle(). Örneğin:

Genel statik final int IDM_HELP = 101; genel statik final int IDM_NEW = 201; genel statik final int IDM_OPEN = 202; genel statik final int IDM_SAVE = 203; genel statik final int IDM_CUT = 301; genel statik final int IDM_COPY = 302; genel statik final int IDM_PASTE = 303; @Override public boolean onCreateOptionsMenu(Menü menüsü) ( SubMenu subMenuFile = menu.addSubMenu("Dosya"); subMenuFile.add(Menu.NONE, IDM_NEW, Menu.NONE, "New"); subMenuFile.add(Menu.NONE, IDM_OPEN , Menu.NONE, "Aç"); subMenuFile.add(Menu.NONE, IDM_SAVE, Menu.NONE, "Save"); SubMenu subMenuEdit = menu.addSubMenu("Düzenle"); subMenuEdit.add(Menu.NONE, IDM_CUT) , Menu.NONE, "Kes"); subMenuEdit.add(Menu.NONE, IDM_COPY, Menu.NONE, "Copy"); subMenuEdit.add(Menu.NONE, IDM_PASTE, Menu.NONE, "Yapıştır"); menu. add(Menu.NONE, IDM_HELP, Menu.NONE, "Help"); return super.onCreateOptionsMenu(menu); ) @Override public boolean onOptionsItemSelected(MenuItem item) ( CharSequence mesajı; switch (item.getItemId()) ( case IDM_NEW : mesaj = "Yeni öğe seçildi"; ara; case IDM_OPEN: mesaj = "Öğeyi aç seçildi"; ara; case IDM_SAVE: mesaj = "Öğeyi kaydet seçildi"; ara; case IDM_CUT: mesaj = "Öğeyi kes seçildi"; break; vaka IDM_COPY:mesaj= "Seçili öğeyi kopyala"; kırmak; case IDM_PASTE: mesaj = "Seçili yapıştır"; kırmak; case IDM_HELP: mesaj = "Yardım öğesi seçildi"; kırmak; varsayılan: false döndür; ) // seçilen menü öğesi hakkında bir bildirim göster Toast tost = Toast.makeText(bu, mesaj, Toast.LENGTH_LONG); tost.setGravity(Gravity.CENTER, 0, 0); tost.göster(); true döndür; )

Şimdi, bir menü öğesini seçtiğinizde, alt menüye sahip başka bir pencere görünecektir. Kendin dene.

Onay kutuları ve radyo düğmeleri ekleme

Menü öğelerine onay kutuları veya radyo düğmeleri ekleyebilirsiniz. Tek bir menü öğesi için bir onay kutusu veya radyo düğmesi eklemek için yöntemi kullanmanız gerekir. setKontrol edilebilir():

MenuItem item = menu.add(0, IDM_FORMAT_BOLD, 0, "Kalın"); item.setCheckable(true);

Onay kutuları veya radyo düğmeleri ile birkaç menü öğesi eklemeniz gerekiyorsa, ayrı bir tanımlayıcı oluşturarak bunları menü grupları halinde birleştirebilirsiniz. Menü öğesi, yöntem aracılığıyla gruba eklenir. Ekle(), ilk parametre olarak menü grubunun kimliğini ileterek. Renk menü grubu ve rengi ayarlamak için menü öğeleri için kimlikler beyan ettiğimizi varsayalım:

Genel statik final int IDM_COLOR_GROUP = 400; genel statik final int IDM_COLOR_RED = 401; genel statik final int IDM_COLOR_GREEN = 402; genel statik final int IDM_COLOR_BLUE = 403;

Şimdi onay kutuları olan bir menü grubu oluşturmak için, her menü öğesine bir grup kimliği atamanız ve yöntemi çağırmanız gerekir. setGroupCheckable() tüm grup için (bu durumda, yöntemi çağırmaya gerek yoktur) setKontrol edilebilir() her menü öğesi için):

SubMenu subMenuColor = menu.addSubMenu("Renk"); subMenuColor.add(IDM_COLOR_GROUP, IDM_COLOR_RED, Menu.NONE, "Kırmızı"); subMenuColor.add(IDM_COLOR_GROUP, IDM_COLOR_GREEN, Menu.NONE,"Yeşil"); subMenuColor.add(IDM_COLOR_GROUP, IDM_COLOR_BLUE, Menu.NONE, "Mavi"); subMenuColor.setGroupCheckable(IDM_COLOR_GROUP, true, false);

Yöntemde setGroupCheckable()üç seçenek:

  • ilk parametre menü grubu kimliğidir;
  • ikinci parametre, grupta radyo düğmelerine veya onay kutularına izin veriliyorsa doğrudur;
  • üçüncü parametre - menü öğelerinin tek (doğru) veya çoklu (yanlış) seçimini ayarlar. Bu ayar aslında menünün görünümünü belirler - radyo düğmeleri veya onay kutuları olan bir menü olacaktır.

    Menü öğesi seçimi olay işleyicisindeki onay kutularının ve radyo düğmelerinin durumunu kontrol etmek için aşağıdakini yazın:

    @Override public boolean onOptionsItemSelected(MenuItem item) ( CharSequence mesajı; switch (item.getItemId()) ( ... case IDM_COLOR_RED: // onay kutusunun durumunu ters çevirin item.setChecked(!item.isChecked()); mesaj = "Kırmızı renk"; ara; varsayılan: false döndür; )

    Projeyi çalıştırın, menüyü açın ve menü öğesini seçin Renk. Bayrak şeklinde üç öğeli (Kırmızı, Yeşil, Mavi) bir alt menünüz olacak. Onay kutularının ve anahtarların durumu program kodunda işlenir ve menü tekrar çağrıldığında kaydedilir.

    Bu olay onMenuItemClickListener (kullanımdan kaldırıldı) veya onOptionsItemSelected işleyicileri tarafından yakalanmadıysa, bu öğe tıklandığında tetiklenecek olan setIntent() yöntemi aracılığıyla seçilen menü öğesine hemen bir amaç atayabilirsiniz. Tetiklendikten sonra amaç, startActivity yöntemine iletilir.

    MenuItem.setIntent(yeni Amaç(bu, MyOtherActivity.class));

    Bir menüyü programlı olarak açma veya kapatma

    Herhangi bir nedenle menüyü programlı olarak açmanız gerekiyorsa (örneğin, gösteri amacıyla), yöntemi kullanın openOptionsMenu():

    OpenOptionsMenu();

    Menüyü programlı olarak kapatmak için yöntemi kullanın kapatSeçeneklerMenü(), ancak, yönteme tekrarlanan bir çağrım var openOptionsMenu() ayrıca menüyü kapatır.

    Bir menü öğesini programlı olarak kaldırma

    Diyelim ki bir xml dosyasında bir menü öğesi tanımladık:

    Açıkça gereksiz bir menü öğesini cat programımızdan kaldırmak için, menü öğesine yöntem aracılığıyla erişmemiz gerekir. bulunÖğe() ve görünmez yapın. Menu nesnesine bir referans, metoda iletilmelidir. onCreateOptionsMenu böylece program menünün bileşimindeki değişikliği öğrenir.

    // sınıf değişkeni Menü menüsü; @Override public boolean onCreateOptionsMenu(Menu menu) ( super.onCreateOptionsMenu(menu); // nesnemize bir referans iletin this.menu = menu; getMenuInflater().inflate(R.menu.test, menu); return true; ) // düğme tıklama public void onClick(View v) ( if (menu != null) ( // istenen öğeyi bul MenuItem item_dog = menu.findItem(R.id.action_dog); // onu görünmez yap item_dog.setVisible(false ); ))

    Fakat bu karar bir dezavantajı var, ekranı döndürürsek aktivite yeniden oluşturulacak ve uzak menü yeniden görünecektir. Çirkin köpekten nasıl kurtulabiliriz?

    Menü öğesinin durumunu hatırlamamız ve onu yöntemde Bundle türünde bir nesnede saklamamız gerekiyor. onSaveInstanceState, ve yöntemde onCreate() kaydedilmiş durumu getir ve yönteme geç onPrepareOptionsMenüsü Menü ekranda gösterilmeden önce çağrılan ,

    Paket en.alexanderklimov.test; android.app.Activity'yi içe aktar; android.os.Bundle'ı içe aktar; android.view.Menu'yu içe aktar; android.view.MenuItem'i içe aktar; android.view.View'ı içe aktar; public class TestActivity, Activity'yi genişletir ( Menu menüsü; Boolean saveMenuDogIsVisible; son statik String KEY_MENU_DOG = "KEY_MENU_DOG"; @Override public void onCreate(Bundle saveInstanceState) ( super.onCreate(savedInstanceState); setContentactivity retrieve(R.test); menü öğesi görünürlük verileri if (savedInstanceState != null) ( saveMenuDogIsVisible = saveInstanceState.getBoolean(KEY_MENU_DOG, true); ) ) @Override public boolean onCreateOptionsMenu(Menu menu) ( super.onCreateOptionsMenu(menu); get.menu = menu; .inflate(R.menu.test, menu); return true; ) public void onClick(View v) ( if (menu != null) ( MenuItem item_dog = menu.findItem(R.id.action_dog); // hide menü öğesi item_dog.setVisible(false); ) ) @Override protected void onSaveInstanceState(Bundle outState) ( // TODO Otomatik oluşturulan yöntem stub super.onSaveInstanceState(outState); if (menu != null) ( MenuItem item_dog = menu. findItem(R.id.action_dog); // menü öğesinin mevcut durumunu kaydedin - true veya false outState putBoolean(KEY_MENU_DOG, item_dog.isVisible()); ) ) @Override public boolean onPrepareOptionsMenu(Menu menüsü) ( if (savedMenuDogIsVisible != null) ( MenuItem item_dog = menu.findItem(R.id.action_dog); // menünün istenen durumunu görüntülemeden önce item_dog.setVisible(savedMenuDogIsVisible ) ; ) super.onPrepareOptionsMenu(menu); ) döndür

    Menü düğmesinin varlığını algıla

    Daha eski cihazlar gerçek bir Menü düğmesi kullandı. Yeni sürümlerde android menüsü ActionBar'da kaldırıldı ve ayrı bir düğme olarak varlığı isteğe bağlı hale geldi. Ancak birçok üretici hala menü düğmesi olan telefonlar üretiyor. Böyle bir düğme olup olmadığını belirlemek için Android 14 eklendi yeni yöntem, bu düğmenin varlığını belirleyecektir.

    If(Build.VERSION.SDK_INT<= 10 || (Build.VERSION.SDK_INT >= 14 && ViewConfiguration.get(this) .hasPermanentMenuKey())) ( // menü tuşu mevcut Toast.makeText(bu, "Menü Düğmesi", Toast.LENGTH_LONG).show(); ) else ( // Menü yok key Toast.makeText(bu, "Menü Düğmesi Yok", Toast.LENGTH_LONG).show(); )

    Menü için işaretleme

    Modern cihazlarda menü, Eylem Çubuğu. Ve menü düzenini XML aracılığıyla özelleştirebilirsiniz.

    Diyelim ki bu seçeneği seçtiniz:

    öznitelikte showAsAction değeri kullanma asla, aksi takdirde işaretlemeyi göremezsiniz. İşaretlemenin kendisi öznitelik aracılığıyla belirtilir. eylem Düzeni. İşaretleme kodu:

    Parçalar halinde menü

    Bir menü sadece bir aktivitenin parçası değil, aynı zamanda bir parçanın da parçası olabilir. Çalışma prensibi pratik olarak aynıdır. Parçanın karşılık gelen bir yöntemi vardır.

    @Override public void onCreateOptionsMenu(Menü menüsü, MenuInflater inflater) ( super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.fragment_crime_list, menu); )

    FragmentManager aramadan sorumlu onCreateOptionsMenu() aktivite bir geri arama aldığında onCreateOptionsMenu() sistemden. Yöneticiye açıkça söylemelisiniz FragmentManager parçanın çağrılması gerektiğini onCreateOptionsMenu(). Bunun için yöntem denir. setHasOptionsMenu():

    // Parça kodunda @Override public void onCreate(Bundle saveInstanceState) ( super.onCreate(savedInstanceState); setHasOptionsMenu(true); getActivity().setTitle(R.string.cat); ... )

Honeycomb'dan (Android 3.0) önce, tüm Android cihazların ekranın altında bir "menü" düğmesi vardı. Geliştiriciler bunu uygun gördükleri şekilde kullanabilirler ve birçok uygulamanın arayüzü bu düğmenin etrafında oluşturulmuştur. Tablet odaklı Honeycomb, mekanik (ve dokunmatik) düğmelerden bir adım uzaklaştı ve bu konuda üçüncü android sürümleri kullanıcıya vermeyi mümkün kılan ActionBar sınıfı ortaya çıktı hızlı erişim eylem çubuğu adı verilen özel bir panel aracılığıyla uygulama ayarlarına. Göre Google Geliştiricileri Eylem Çubuğu gelecek ve programcılar "menü" düğmesini kullanmayı bırakmalıdır. Pazara şu anda mekanik veya akıllı telefonlar hakimdir. dokunmatik düğme ekranın altında, ancak Ice Cream Sandwich'in ortaya çıkmasıyla durum önemli ölçüde değişebilir. Bir geliştirici olarak, bu tür cihazların görünümüne önceden hazırlanmanız ve Eylem çubuğu konseptini bugün kullanmanız önemlidir.

İlk bakışta, Eylem Çubuğu'nu kullanmak, henüz bu çubuğun uygulanmadığı Android 2.x için programlar geliştirirken sorunlara neden olacak gibi görünebilir. Ancak burada bir sorun yok. Hiç kimse, bulunduğu cihazlarda "menü" düğmesini kullanmaya devam etmenizi yasaklamaz, bir Eylem Çubuğu eklemek yalnızca birkaç satır kod yazmanızı gerektirir.

Bu makaleyi tek bir cümleye sığdırmaya çalışsaydım, şöyle olurdu: " TargetSdkVersion'ı 14'e ayarlayın ve Eylem Çubuğunda oluşturulması gereken menü öğelerinde showAsAction="ifRoom" etiketini işaretleyin".

Android'deki ayarlar menüsünün son reddi

Sadece "menü" düğmesini kullanmayı bırakmanız yeterli değil, konsepti tamamen kafanızdan çıkarmanız gerekiyor. Menü oluşturmayın, gerekli tüm düğmeleri doğrudan etkinliklerin içinde oluşturun. Bazı eylemler panele sığmıyorsa, bunları ek bir açılır menüye yerleştirin (eylem taşması). Yukarıdaki resimde, arama düğmesi bulunan bir eylem çubuğu ve çubuğun sağ tarafında ek bir menü gösterilmektedir.

Uygulamanız için oluşturulmuşsa eski versiyon android (geleneksel olarak bir menü kullanır), daha sonra bir Android 3 tablette başlatıldığında, ekranın altında ikinci şubenin telefonlarında bulunan üç düğmeyi taklit eden bir panel görüntülenecektir.

Terminoloji oldukça kafa karıştırıcıdır, ancak açılır menü (eylem taşması), basit bir ayarlar menüsünden tamamen farklı bir kullanım konsepti önerir. Bir menüyü uygulamanın tüm ayarları için bir havuz olarak düşünmek yerine, ana ayarları koyduğunuz bir panel oluşturursunuz. İkincil olan her şey, panelin sağ tarafında bulunan üç noktalı butona (Eylem taşması butonu) tıkladığınızda çağrılan açılır menüden çıkarılır.

eylem taşması düğmesi

Ekranın altında düğmeleri olmayan cihazlarda (örneğin, Petek bulunan bir tablette veya Galaxy Nexus'ta) Android 2.3 ve altı için yazılmış uygulamaları çalıştırdıysanız, resmin yanında bir Eylem taşması düğmesinin göründüğünü fark etmiş olabilirsiniz. alttaki panelde üç düğme (üst üste üç nokta). Bu bir uzlaşmadır, ancak çok iyi bir uzlaşma değildir. Ayarlar menüsünü hiç kullanmayan uygulamalarda bu buton hiçbir şey yapmıyor, kullanıcıları rahatsız ediyor. Bu nedenle, takip etmek çok iyi bir çözüm olacaktır. android versiyonu ve programınız Android 3.0+ altında çalışıyorsa, bu düğmeyi gezinme çubuğundan kaldırın ve Eylem Çubuğunu kullanın. Bu yaklaşım, programı eski cihazlarla uyumlu tutmanıza ve yenileri için daha çekici hale getirmenize olanak tanır.

Programınız düğmesiz cihazlarda çalışıyorsa, alanın değerine bağlı olarak gezinme çubuğuna eylem taşması eklenip eklenmeyeceğine sistem karar verir. manifestoda. mantık şu şekilde

  • minSdkVersion veya targetSdkVersion'ı 11'den büyük bir değere ayarlarsanız, sistem bu düğmeyi eklemez.
  • Öte yandan, uygulamayı Android 3.0 ve üzeri sürümlerde çalıştırdığınızda sistem bu düğmeyi oluşturur.
  • Tek istisna, minSdkVersion'ı 10 veya daha düşük bir değere ayarlamanızdır; targetSdkVersion'ı 11, 12 veya 13'e yükseltir ve ActionBar'ı kullanmaz, sistem bu düğmeyi altındaki telefonlara (tabletlere değil) ekler. Android kontrolü 4.0 ve üzeri. Bu istisna şu fikre dayanmaktadır: ikinci dalın telefonları ve üçüncü dalın tabletleri için bir uygulama geliştiriyorsanız, telefonların bir menü düğmesi olması gerektiğini varsayıyorsunuz, ancak tabletlerde yok.

Bu nedenle, gezinme çubuğundaki bir düğmenin taşma eylemini devre dışı bırakmak istiyorsanız, targetSdkVersion'ı 14'e ayarlamanız gerekir (minSdkVersion, Düşük değer Böylece program eski cihazlarda çalışabilir).

Eylem çubuğu konseptine geçiş

Seçenekler menüsünü kullanan (onCreateOptionsMenu() ile oluşturulmuş) etkinlikleriniz varsa, düğmeyi gezinme çubuğundan kaldırarak (hedefSdkVersion=14 ayarlayarak) kullanıcıya seçeneklere erişmek için alternatif bir yol sağlamalısınız. Neyse ki, sistem otomatik olarak bir eylem çubuğu oluşturduğu için fazla bir iş yapmanıza gerek yok.

Etiketlerinize showAsAction="ifRoom" ekleyin eylem çubuğuna koymak istediğiniz öğeler. Eylem Çubuğuna hangi öğeyi ekleyeceğinizden emin değilseniz, Android Design'ın Eylem Çubuğu kılavuzuna bakın.

Programınızın algısını daha bütünsel hale getirmek için aşağıdaki simgelerden yararlanmanızı öneririz. Android UX Ekibi. Arşiv .

Android Uygulamasından Eylem Çubuğu Nasıl Kaldırılır

Eylem çubuğuna ihtiyacınız yoksa, herhangi bir etkinlikten, hatta uygulamadan kaldırabilirsiniz. Bu, ayarlar menüsünü kullanmayan oyunlar ve programlar için geçerli olabilir. Theme.Holo.NoActionBar veya Theme.DeviceDefault.NoActionBar temasını kullanarak eylem çubuğunu kaldırabilirsiniz.

Bu şemaları kullanmak ancak devam etmek istiyorsanız geriye dönük uyumlu için farklı temalar ayarlamak için kaynak yönetim sistemini kullanabilirsiniz. farklı versiyonlar platformlar. Bu konu daha ayrıntılı olarak ele alınmıştır burada. Temalardan miras alacak kendi temanızı oluşturmanız gerekecek çeşitli platformlar mevcut sürüme bağlı olarak.

Örneğin, uygulamanız için bir tema bildirebilirsiniz.

(veya bir etiketteki belirli bir etkinlik için ).

Android 2 çalıştıran cihazlar için res/values/themes.xml dosyasına aşağıdaki temayı ekleyin.



Honeycomb için res/values-v11/themes.xml dosyasına aşağıdaki temayı ekleyin.



Başlangıçta, API sürümüne bağlı olarak sistem uygun temayı seçecektir.

Çözüm

Makalenin ana fikirlerini ve noktalarını özetleyelim:

  • Üzerinde yeni Android Cihazların bir "menü" düğmesi olmayabilir, bu nedenle program geliştirirken onu hiç kullanmamak en iyisidir.
  • targetSdkVersion = 14 olarak ayarlayın ve uygulamanızı Android 4.0'da test edin.
  • showAsAction="ifRoom" etiketini şuraya ekleyin: otomatik olarak eylem çubuğuna gitmesini istiyorsanız bir menü öğesi.
  • Uygulamanız ActionBar kullanmıyorsa Theme.Holo.NoActionBar ve Theme.DeviceDefault.NoActionBar temalarını kullanarak kaldırabilirsiniz.

Android, çeşitli menü türlerini destekler. İlk olarak - telefonda ayrı bir düğme var Menü(eski telefonlarda), menüyü getiren tuşa basın. Yeni cihazlarda, ayrı bir düğme kaldırıldı ve bunun yerine bir menü simgesi eklendi. üç dikey yönde noktalar. İkinci tür, ekranda parmağınızı basılı tuttuğunuzda görünen bir bağlam menüsüdür. Doğru yer(Telefonunuzun orta düğmesini de basılı tutabilirsiniz). bağlam menüsü sırayla bir alt menüye sahip olabilir. Bugün ilk menü türüyle tanışacağız. Bu makale, Android 4.0 ve sonraki sürümleri çalıştıran yeni cihazlarda menüyle çalışmayı ele alacaktır.

şablonda boş aktivite menü yok, bu yüzden kendimiz oluşturacağız. Bu, nasıl çalıştığını anlamanıza ve proje hakkında genel bir fikir edinmenize yardımcı olacaktır. Menü öğelerinin seçimini yapmak için sınıfların, yöntemlerin ve kodların adlarını ezberlemek gerekli değildir. Diğer şablonlarda menü yerleşik olacaktır ve hemen kullanabilirsiniz.

Oluşturmak yeni proje temelli boş aktivite ve çalıştırın. Henüz bir menü yok.

Bir dosyada birden çok dize kaynağı oluşturun res/values/strings.xml, menü öğelerinden sorumlu olacak:

Ayarlar Kedi Kedi Yavru kedi

Şimdi yeni bir klasör oluşturun Menü klasörde res res, | Yeni | dizin). Ardından, oluşturulan klasörde bir dosya oluşturun menu_main.xml- isim, menünün ana aktiviteye ait olduğunu gösterir Ana aktivite(klasöre sağ tıklayın Menü | Yeni | Menü Kaynak Dosyası). Birden çok ekranı olan bir uygulama oluşturursanız, her aktivitenin kendi ayarlarıyla ayrı bir menüsü olacaktır. Dosyayı açarken menu_main.xml ve kodumuzu ortaya çıkan şablona ekleyin:

dosyayı açalım Ana aktivite. Şu anda tek bir yöntemi var. onCreate(). Yeni bir yöntem ekleyelim onCreateOptionsMenu(). Aynen öyle Bu method aktivitedeki menünün görünümünden sorumludur. Stüdyo menüsünden seçin kod| ve bir sonraki pencerede, yöntemin adını ilk harflerle yazmaya başlayın. Önce girilebilir büyük harfler, yani ocom( Ö n C oran Ö seçenekler M tr) istenen dizeyi hızlı bir şekilde bulmak için. düğmeye basıyoruz TAMAM ve iş parçasını alıyoruz.

@Override public boolean onCreateOptionsMenu(Menü menüsü) ( super.onCreateOptionsMenu(menu); döndür)

Menü kaynaklarından veri alan ve bunları ekrandaki menü öğelerine dönüştüren hazırlığa bir yöntem ekliyoruz.

@Override public boolean onCreateOptionsMenu(Menu menu) ( getMenuInflater().inflate(R.menu.menu_main, menu); return true; )

yöntemde şişirmek() bir menü kaynağına işaret ediyorsunuz ( R.menu.menu_ana) ve sınıf nesnesi Menü.

İngilizce'de "inflate", şişirmek olarak çevrilir, yani. tasarım gereği android geliştiricileri, bir nesneyi verilerle, örneğin bir menüyle şişiririz. Ama aslında "şişirmek" kelimesi şu ifadeden gelmektedir. düz- daireye. İlk kediyi daireye sokmak için eski bir gelenek vardır; bu, evin tüm kuytu köşelerini araştırır ve içinde yaşamayı kabul ettiğini beyan eder. Bu yüzden XML dosyasındaki verileri MenuInflater nesnesine çalıştırıyoruz.

Projeyi çalıştırın. Şimdi başlığın sağ tarafında üç noktadan oluşan bir simge göreceksiniz. dikey çizgi. Menü öğesini görmek için simgeye tıklayın Ayarlar.

Tahmin edilmesi zor olmadığı için eleman öğe ayrı bir menü öğesinden sorumludur. Aynı şekilde sadece menünün tanımlayıcısını ve metnini değiştirerek üç öğe daha ekleyelim:

Projeyi çalıştırın ve menüyü tekrar açmayı deneyin. Üç yeni öğe göreceksiniz.

Seçenekler İD ve Başlık açıklamaya gerek yok. Parametre siparişInCategory kendi menü öğesi görüntüleme sıranızı belirlemenizi sağlar. Beş menü öğesi oluşturduğunuzu, ancak bunların ekranda görüntülenme sırasına henüz karar vermediğinizi varsayalım. Menü öğeleri için tüm kod bloklarını sürekli olarak hareket ettirmemek için doğru sıra, bu seçeneği kullanabilirsiniz.

Ve son olarak, önemli bir özellik app:showAsAction menünün davranışını tanımlar. Eylem Çubuğu. Anlam asla menü öğesinin başlıkta değil, yalnızca açılır menüde görüntülenmesi gerektiği anlamına gelir, yani. üç noktanın arkasında olun. değeri ayarlarsanız Her zaman, sonra nokta Ayarlar hemen uygulamanızın başlığında görünecektir. Ayrıca mevcut değerler ifOdalar, Metin ile ve daraltAksiyonGörünüm. Kendin dene. Örneğin, ifOda Alan izin veriyorsa bir menü öğesi görüntüler. Çok fazla puan varsa, o zaman sadece yoluna girecekler. Kural olarak, bu seçenek, üç noktaya gereksiz tıklamaları önlemek için sık yapılan işlemler için çok kısa bir kelime veya simge görüntüler.

Özelliğe dikkat edin app:showAsAction, ad alanına ait olan xmlns:app="http://schemas.android.com/apk/res-auto". Böyle bir ad alanının olmadığı ve projelerin özniteliği kullandığı bir zaman vardı. android:showAsAction standart ad alanından. Stüdyo hataya yemin edecekse, kodu düzenleyin.

Menü öğeleri yürütülene kadar faydalı iş. Öğeye herhangi bir tıklama, görünür sonuçlar olmadan menüyü kapatır. Henüz tıklamaları işlemek için kod yazmadık.

Menü öğelerini seçme

Menü oluşturmayı öğrendik. Ancak, menü öğeleri tıklamalarımıza hiçbir şekilde tepki vermediğinden, şimdiye kadar işe yaramaz. Menü tıklamalarını işlemek için başka bir yöntem kullanılır. onOptionsItemSelected(). Bir önceki örnekteki gibi bir method ekleyelim. Gelelim hazırlığa.

@Override public boolean onOptionsItemSelected(MenuItem item) ( return super.onOptionsItemSelected(item); )

Parametre öğe menü öğesinden sorumludur. Yöntem yoluyla menü kimliği almalısınız getItemId() ve bunun için bir kod girin. Menü genellikle birkaç öğeden oluştuğu için yapıları kullanmak uygundur. eğer/else veya değiştirmek. Bilgileri görüntülemek için bir metin etiketi kullanırız. Etkinlik ekranına bir bileşen ekleyin Metin görünümü. mevcut olanı kullanabilirsin Metin görünümü"Merhaba Dünya!" etiketli, sadece bir kimlik verin.

android:id="@+id/textView" android:layout_width="wrap_content" Android:layout_height="wrap_content" Android:text="Merhaba Dünya!"/>

Seçili menü öğesi için boşluğa kodu ekleyelim:

@Override public boolean onOptionsItemSelected(MenuItem item) ( // Seçilen menü öğesinin kimliğini al int id = item.getItemId(); TextView infoTextView = (TextView) findViewById(R.id.textView); // Seçilen menü öğesinin kimliğini al menü öğesi anahtarı ( id) ( case R.id.action_cat1: infoTextView.setText("Bir kedi seçtiniz!"); return true; case R.id.action_cat2: infoTextView.setText("Bir kedi seçtiniz!"); dönüş true; case R. id.action_cat3: infoTextView.setText("Bir yavru kedi seçtiniz!"); return true; default: return super.onOptionsItemSelected(item); ) )

Uygulamayı çalıştırın, menüyü açın ve herhangi bir menü öğesini seçin. Metin kutusunda bir mesaj görünmelidir.

var alternatif yol düğme tıklamalarını işlemeye benzer XML aracılığıyla (Android 3.0'dan beri). özellik ekleyebilirsiniz android: onclick menü kaynaklarında ve yöntem çağrısı kullanmanıza gerek yok onOptionsItemSelected(). yardım ile android: onclick bir menü öğesi seçerken istediğiniz yöntemi belirleyebilirsiniz. Bu özelliği öğeye ekle Ayarlar

Şimdi aktivite koduna aşağıdakileri yazacağız:

// Ayarlar menüsü öğesi özelliği Android:onClick="onSettingsMenuClick" public void onSettingsMenuClick(MenuItem öğesi) ( TextView infoTextView = (TextView) findViewById(R.id.textView); infoTextView.setText("Ayarları seçtiniz, bir kedi seçsen daha iyi"); )

Anahtarlar

Menü öğelerinin görünümü, radyo düğmeleriyle bir görünüme dönüştürülebilir. Bunu yapmak için bir öğe ekleyin grup nitelik ile android:checkableBehavior="single":

Bu modda pek bir anlam görmüyorum. Ve bunu dikkate almayacağız.

Tasarım modu

Android Studio 2.2, ekrana yeni bileşenler eklemek için bir araç çubuğuna benzeyen bir grafik menü oluşturma modu ekledi. Menü çubuğu dört öğeden oluşur: Menü seçeneği, Öğe Ara, Menü, grup.

Prensip aynıdır, istediğiniz öğeyi seçin ve ekranda menü alanına sürükleyin. Manuel olarak bir menü oluşturmayı öğrendiyseniz, o zaman Bu method size sorun çıkarmaz. Bununla menü yapısını hızlı bir şekilde çizebilir ve ardından manuel olarak değiştirebilirsiniz.