Android Binding - Introduction
回顾前面的几篇,我们都是直接在代码中添加菜单项,给菜单项分组等,这是比较传统的做法,它存在着一些不足。比如说,为了响应每个菜单项,我们需要用常量来保存每个菜单项的ID等。为此,Android提供了一种更好的方式,就是把menu也定义为应用程序的资源,通过android对资源的本地支持,使我们可以更方便地实现菜单的创建与响应。这一篇就介绍如何使用XML文件来加载和响应菜单,我们需要做这几步:
- 在/res目录下创建menu文件夹
- 在menu目录下使用与menu相关的元素定义xml文件,文件名是随意的,android会自动为其生成资源ID。例如:R.menu.mainmenu对应menu目录的mainmenu.xml资源文件
- 使用xml文件的资源ID,将xml文件中定义的菜单项添加到menu对象中
- 响应菜单项时,使用每个菜单项对应的资源ID
下面就使用xml的方式完成《Android菜单详解(二)——创建并响应选项菜单》中的options menu。
定义菜单资源文件
在res目录下创建menu文件夹,在menu下创建一个xml资源文件,我这里叫做mainmenu.xml
编写mainmenu.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android">
<!-- group1 -->
<group android:id="@+id/group1">
<item android:id="@+id/mi1"
android:title="item1"/>
<item android:id="@+id/mi2"
android:title="item2"/>
</group>
<!-- group 2 -->
<group android:id="@+id/group2">
<item android:id="@+id/mi3"
android:title="item3"/>
<item android:id="@+id/mi4"
android:title="item4"/>
</group>
</menu>
这里简单的添加了4个菜单项,并将其分为2组。item元素的android:title值可以引用values中的string资源。
使用MenuInflater添加菜单项
inflater在android中建立了从资源文件到对象的桥梁,MenuInflater即把菜单xml资源转换为对象并添加到menu对象中,它可以通过activity的getMenuInflater()得到。我们在MainActivity中重写onCreateOptionsMenu(...)方法。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.mainmenu, menu);
return true;
}
响应菜单项
最后重写onOptionsItemSeleted(...)方法。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case R.id.mi1:
// do sth
break;
case R.id.mi2:
// do sth
break;
case R.id.mi3:
// do sth
break;
case R.id.mi4:
// do sth
break;
}
return true;
}
这一步最大的体现了使用XML生成菜单的好处。android不仅为我们定义的xml文件生成了资源ID,同样可以为group,menu item来自动生成ID(就像为布局中定义的view生成id那样)。这样菜单项ID的创建与管理就不用我们操心了,全部交给android去做吧!
至此,我们完成了一个简单的“使用XML生成菜单”的demo,并从中体会到了使用资源文件的好处,因此这是android中创建菜单的推荐方式。实际上,我们在代码中对菜单项或分组的操作都能在xml文件中完成,下面就简单介绍一些比较常用的功能。(谷歌提供的API demos中有最全面的示例)
更多菜单资源文件的功能
1.资源文件实现子菜单
子菜单通过在item元素中嵌套menu来实现。
<item android:title="系统设置">
<menu>
<item android:id="@+id/mi_display_setting"
android:title="显示设置"/>
<item android:id="@+id/mi_network_setting"
android:title="网络设置"/>
<!-- 别的菜单项 -->
</menu>
</item>
2.为菜单项添加图标
<item android:id="@+id/mi_exit"
android:title="退出"
android:icon="@drawable/exit"/>
3.设置菜单项的可选出现
使用android:checkableBehavior设置一组菜单项的可选策略,可选值为:none, all, single
<group android:id="..."
android:checkableBehavior="all">
<!-- 菜单项 -->
</group>
使用android:checked设置特定菜单项
<item android:id="..."
android:title="sometitle"
android:checked="true"/>
4.设置菜单项可用/不可用
<item android:id="..."
android:title="sometitle"
android:enabled="false"/>
5.设置菜单项可见/不可见
<item android:id="..."
android:title="sometitle"
android:visible="false"/>
结语
本篇是Android菜单详解系列的最后一篇,本系列详细介绍了android中各种常用菜单的使用技巧和注意事项,希望能帮助大家更好的理解,也期待与各位交流开发中的心得:)
作者: CodingMyWorld 发表于 2011-08-28 12:26 原文链接
发表评论
Интересно, я даже и не думала об этом…
Действительно удивили и порадовали Никогда не поверил бы, что даже такое бывает
блог знакомый в аську ссылку кинул
Спасибо. Забавно
Тут уже столько написали комментариев до меня. Осталось только присоединиться
Думается, если долго стараться, даже самую сложную мысль можно так подробно раскрыть.
Спасибо за статью оказалась очень полезной.
Отлично написано. А главное хорошо разжевано.
Надеюсь, остальные записи окажутся такими же интересными
кстати автору хочу предложить установить от яндекс.денег
P.S. Сайт, кстати, у вас прикольно сверстан
было познавательно прочесть, здоровски
Подписался на RSS, буду следить =)
Тут уже столько написали комментариев до меня. Осталось только присоединиться
Думаю, эту тему можно развивать до бесконечности Хорошо пишете. Учились где-то или просто с опытом пришло?
Как обычно просто супер обьёмная статья и как всегда дочитал до конца
Хорош фигней маяться, давайте посерьезнее будем!
Где то я это уже видел
Подскажите, можно ли разместить на своем сайте данный пост?
Отлично написано. А главное хорошо разжевано.
Оригинальная идея. Только вот интересно сколько время на это потрачено?
Да, есть над чем задуматься. Спасибо!
Было бы интересно узнать поподробнее
И да прибудет с нами сила.|Отличный пост - слов нет. Спасибо.
Давно искала эту информацию, спасибо.
Спасибо за статью оказалась очень полезной.
Спасибо за Ваш труд!!
И как это автору не влом столько времени на написание статей тратить, мы конечно очень благодарны, но вот я на такой альтруизм не способен
Админ, а можно я размещу этот пост на своём сайте?
Хорош фигней маяться, давайте посерьезнее будем
Всем привет кто-нибудь читает делфи? Следит за жизнью в Латвии?
Здравствуйте! Прошу прощения, что пишу не совсем в тему. Я тоже использую Вордпресс для своего блога и у меня возник вопрос, как настроить новую тему. Поиск на официальном сайте ничего не дал, там только пользовательские настройки рассматривают, а мне нужно, видимо, шаблоны править. Не подскажете, где почитать?
Моё мнение вопрос развёрнут полностью, автор выжал всё что можно, за что ему мой поклон!
Мне кажется или автор что-то недоговаривает
Да, такой блог однозначно надо раскручивать сильнее - что б как можно больше людей о нем узнали
Отличная статья Спасибо огромное
Соберем для Вас по сети интернет базу данных
Восхищена как всегда
Не блог, а поток хороших новостей. Как у вас так получается?
Довольно интересно конечно. Я не могу подписаться под каждым вашим словом, но в общем соглашусь.
Не блог, а поток хороших новостей. Как у вас так получается?
+1 к предыдущему комменту
Я извиняюсь, что немного не в тему, а что такое RSS? и ка на него подписаться?
Wow, amazing weblog format! How lengthy have you been running a blog for? you make blogging glance easy.
Очень понравилось, даже не ожидала.
спасибо за статейку
Вот это пост! Сильно. Спасибо.
Млин, спамеры просто достали уже этим своим примитивом!
Здорово вы мне помогли. Честное слово, новыми красками все заиграло.
Я бы сказала о монументальности, грандиозности некоторых сюжетов