图标,可以在<application>或者<activity>中通过logo

来源:互联网 发布:软件编程就业前景 编辑:程序博客网 时间:2024/06/15 20:46
默认情况下,系统会使用<application>或者<activity>中icon属性指定的图片来作为ActionBar的图标,但是我们也可以改变这一默认行为。如果我们想要使用另外一张图片来作为ActionBar的图标,可以在<application>或者<activity>中通过logo属性来进行指定。比如项目的res/drawable目录下有一张weather.png图片,就可以在AndroidManifest.xml中这样指定:
[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <activity 
  2.     android:name="com.example.actionbartest.MainActivity" 
  3.     android:logo="@drawable/weather" > 
  4. </activity> 
[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:14px;"><activity 
  2.     android:name="com.example.actionbartest.MainActivity" 
  3.     android:logo="@drawable/weather" > 
  4. </activity></span> 
[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:14px;"><activity  
  2.     android:name="com.example.actionbartest.MainActivity"  
  3.     android:logo="@drawable/weather" >  
  4. </activity></span>  
现在重新运行一下程序,效果如下图所示:

OK,ActionBar的图标已经修改成功了,那么标题中的内容该怎样修改呢?其实也很简单,使用label属性来指定一个字符串就可以了,如下所示:
[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <activity 
  2.     android:name="com.example.actionbartest.MainActivity" 
  3.     android:label="天气" 
  4.     android:logo="@drawable/weather" > 
  5. </activity> 
[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:14px;"><activity 
  2.     android:name="com.example.actionbartest.MainActivity" 
  3.     android:label="天气" 
  4.     android:logo="@drawable/weather" > 
  5. </activity></span> 
[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:14px;"><activity  
  2.     android:name="com.example.actionbartest.MainActivity"  
  3.     android:label="天气"  
  4.     android:logo="@drawable/weather" >  
  5. </activity></span>  
现在重新运行一下程序,结果如下图所示:

添加Action按钮

ActionBar还可以根据应用程序当前的功能来提供与其相关的Action按钮,这些按钮都会以图标或文字的形式直接显示在ActionBar上。当然,如果按钮过多,ActionBar上显示不完,多出的一些按钮可以隐藏在overflow里面(最右边的三个点就是overflow按钮),点击一下overflow按钮就可以看到全部的Action按钮了。
当Activity启动的时候,系统会调用Activity的onCreateOptionsMenu()方法来取出所有的Action按钮,我们只需要在这个方法中去加载一个menu资源,并把所有的Action按钮都定义在资源文件里面就可以了。
那么我们先来看下menu资源文件该如何定义,代码如下所示:
[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <menu xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     xmlns:tools="http://schemas.android.com/tools" 
  3.     tools:context="com.example.actionbartest.MainActivity" > 
  4.  
  5.     <item 
  6.         android:id="@+id/action_compose" 
  7.         android:icon="@drawable/ic_action_compose" 
  8.         android:showAsAction="always" 
  9.         android:title="@string/action_compose"/> 
  10.     <item 
  11.         android:id="@+id/action_delete" 
  12.         android:icon="@drawable/ic_action_delete" 
  13.         android:showAsAction="always" 
  14.         android:title="@string/action_delete"/> 
  15.     <item 
  16.         android:id="@+id/action_settings" 
  17.         android:icon="@drawable/ic_launcher" 
  18.         android:showAsAction="never" 
  19.         android:title="@string/action_settings"/> 
  20.  
  21. </menu> 
[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:14px;"><menuxmlns:android="http://schemas.android.com/apk/res/android" 
  2.     xmlns:tools="http://schemas.android.com/tools" 
  3.     tools:context="com.example.actionbartest.MainActivity" > 
  4.  
  5.     <item 
  6.         android:id="@+id/action_compose" 
  7.         android:icon="@drawable/ic_action_compose" 
  8.         android:showAsAction="always" 
  9.         android:title="@string/action_compose"/> 
  10.     <item 
  11.         android:id="@+id/action_delete" 
  12.         android:icon="@drawable/ic_action_delete" 
  13.         android:showAsAction="always" 
  14.         android:title="@string/action_delete"/> 
  15.     <item 
  16.         android:id="@+id/action_settings" 
  17.         android:icon="@drawable/ic_launcher" 
  18.         android:showAsAction="never" 
  19.         android:title="@string/action_settings"/> 
  20.  
  21. </menu></span> 
[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:14px;"><menu xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     tools:context="com.example.actionbartest.MainActivity" >  
  4.   
  5.     <item  
  6.         android:id="@+id/action_compose"  
  7.         android:icon="@drawable/ic_action_compose"  
  8.         android:showAsAction="always"  
  9.         android:title="@string/action_compose"/>  
  10.     <item  
  11.         android:id="@+id/action_delete"  
  12.         android:icon="@drawable/ic_action_delete"  
  13.         android:showAsAction="always"  
  14.         android:title="@string/action_delete"/>  
  15.     <item  
  16.         android:id="@+id/action_settings"  
  17.         android:icon="@drawable/ic_launcher"  
  18.         android:showAsAction="never"  
  19.         android:title="@string/action_settings"/>  
  20.   
  21. </menu></span>  
可以看到,这里我们通过三个<item>标签定义了三个Action按钮。<item>标签中又有一些属性,其中id是该Action按钮的唯一标识符,icon用于指定该按钮的图标,title用于指定该按钮可能显示的文字(在图标能显示的情况下,通常不会显示文字),showAsAction则指定了该按钮显示的位置,主要有以下几种值可选:always表示永远显示在ActionBar中,如果屏幕空间不够则无法显示,ifRoom表示屏幕空间够的情况下显示在ActionBar中,不够的话就显示在overflow中,never则表示永远显示在overflow中。
接着,重写Activity的onCreateOptionsMenu()方法,代码如下所示:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. @Override 
  2. public boolean onCreateOptionsMenu(Menu menu) { 
  3.     MenuInflater inflater = getMenuInflater(); 
  4.     inflater.inflate(R.menu.main, menu); 
  5.     return super.onCreateOptionsMenu(menu); 
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:14px;">@Override 
  2. public boolean onCreateOptionsMenu(Menu menu) { 
  3.     MenuInflater inflater = getMenuInflater(); 
  4.     inflater.inflate(R.menu.main, menu); 
  5.     return super.onCreateOptionsMenu(menu); 
  6. }</span> 
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:14px;">@Override  
  2. public boolean onCreateOptionsMenu(Menu menu) {  
  3.     MenuInflater inflater = getMenuInflater();  
  4.     inflater.inflate(R.menu.main, menu);  
  5.     return super.onCreateOptionsMenu(menu);  
  6. }</span>  
这部分代码很简单,仅仅是调用了MenuInflater的inflate()方法来加载menu资源就可以了。现在重新运行一下程序,结果如下图所示:

可以看到,action_compose和action_delete这两个按钮已经在ActionBar中显示出来了,而action_settings这个按钮由于showAsAction属性设置成了never,所以被隐藏到了overflow当中,只要点击一下overflow按钮就可以看到它了。
这里我们注意到,显示在ActionBar上的按钮都只有一个图标而已,我们在title中指定的文字并没有显示出来。没错,title中的内容通常情况下只会在overflow中显示出来,ActionBar中由于屏幕空间有限,默认是不会显示title内容的。但是出于以下几种因素考虑,即使title中的内容无法显示出来,我们也应该给每个item中都指定一个title属性:
  • 当ActionBar中的剩余空间不足的时候,如果Action按钮指定的showAsAction属性是ifRoom的话,该Action按钮就会出现在overflow当中,此时就只有title能够显示了。
  • 如果Action按钮在ActionBar中显示,用户可能通过长按该Action按钮的方式来查看到title的内容。

响应Action按钮的点击事件

当用户点击Action按钮的时候,系统会调用Activity的onOptionsItemSelected()方法,通过方法传入的MenuItem参数,我们可以调用它的getItemId()方法和menu资源中的id进行比较,从而辨别出用户点击的是哪一个Action按钮,比如:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. @Override 
  2. public boolean onOptionsItemSelected(MenuItem item) { 
  3.     switch (item.getItemId()) { 
  4.     case R.id.action_compose: 
  5.         Toast.makeText(this, "Compose", Toast.LENGTH_SHORT).show(); 
  6.         return true
  7.     case R.id.action_delete: 
  8.         Toast.makeText(this, "Delete", Toast.LENGTH_SHORT).show(); 
  9.         return true
  10.     case R.id.action_settings: 
  11.         Toast.makeText(this, "Settings", Toast.LENGTH_SHORT).show(); 
  12.         return true
  13.     default
  14.         return super.onOptionsItemSelected(item); 
  15.     } 
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:14px;">@Override 
  2. public boolean onOptionsItemSelected(MenuItem item) { 
  3.     switch (item.getItemId()) { 
  4.     case R.id.action_compose: 
  5.         Toast.makeText(this, "Compose", Toast.LENGTH_SHORT).show(); 
  6.         return true
  7.     case R.id.action_delete: 
  8.         Toast.makeText(this, "Delete", Toast.LENGTH_SHORT).show(); 
  9.         return true
  10.     case R.id.action_settings: 
  11.         Toast.makeText(this, "Settings", Toast.LENGTH_SHORT).show(); 
  12.         return true
  13.     default
  14.         return super.onOptionsItemSelected(item); 
  15.     } 
  16. }</span> 
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:14px;">@Override  
  2. public boolean onOptionsItemSelected(MenuItem item) {  
  3.     switch (item.getItemId()) {  
  4.     case R.id.action_compose:  
  5.         Toast.makeText(this"Compose", Toast.LENGTH_SHORT).show();  
  6.         return true;  
  7.     case R.id.action_delete:  
  8.         Toast.makeText(this"Delete", Toast.LENGTH_SHORT).show();  
  9.         return true;  
  10.     case R.id.action_settings:  
  11.         Toast.makeText(this"Settings", Toast.LENGTH_SHORT).show();  
  12.         return true;  
  13.     default:  
  14.         return super.onOptionsItemSelected(item);  
  15.     }  
  16. }</span>  
可以看到,我们让每个Action按钮被点击的时候都弹出一个Toast,现在重新运行一下代码,结果如下图所示:


通过Action Bar图标进行导航

启用ActionBar图标导航的功能,可以允许用户根据当前应用的位置来在不同界面之间切换。比如,A界面展示了一个列表,点击某一项之后进入了B界面,这时B界面就应该启用ActionBar图标导航功能,这样就可以回到A界面。
我们可以通过调用setDisplayHomeAsUpEnabled()方法来启用ActionBar图标导航功能,比如:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. @Override 
  2. protected void onCreate(Bundle savedInstanceState) { 
  3.     super.onCreate(savedInstanceState); 
  4.     setTitle("天气"); 
  5.     setContentView(R.layout.activity_main); 
  6.     ActionBar actionBar = getActionBar(); 
  7.     actionBar.setDisplayHomeAsUpEnabled(true); 
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:14px;">@Override 
  2. protected void onCreate(Bundle savedInstanceState) { 
  3.     super.onCreate(savedInstanceState); 
  4.     setTitle("天气"); 
  5.     setContentView(R.layout.activity_main); 
  6.     ActionBar actionBar = getActionBar(); 
  7.     actionBar.setDisplayHomeAsUpEnabled(true); 
  8. }</span> 
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:14px;">@Override  
  2. protected void onCreate(Bundle savedInstanceState) {  
  3.     super.onCreate(savedInstanceState);  
  4.     setTitle("天气");  
  5.     setContentView(R.layout.activity_main);  
  6.     ActionBar actionBar = getActionBar();  
  7.     actionBar.setDisplayHomeAsUpEnabled(true);  
  8. }</span>  
现在重新运行一下程序,结果如下图所示:

可以看到,在ActionBar图标的左侧出现了一个向左的箭头,通常情况下这都表示返回的意思,因此最简单的实现就是在它的点击事件里面加入finish()方法就可以了,如下所示:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. @Override 
  2. public boolean onOptionsItemSelected(MenuItem item) { 
  3.     switch (item.getItemId()) { 
  4.     case android.R.id.home: 
  5.         finish(); 
  6.         return true
  7.     …… 
  8.     } 
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:14px;">    @Override 
  2.     public boolean onOptionsItemSelected(MenuItem item) { 
  3.         switch (item.getItemId()) { 
  4.         case android.R.id.home: 
  5.             finish(); 
  6.             return true
  7.         …… 
  8.         } 
  9.     }</span> 
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:14px;">    @Override  
  2.     public boolean onOptionsItemSelected(MenuItem item) {  
  3.         switch (item.getItemId()) {  
  4.         case android.R.id.home:  
  5.             finish();  
  6.             return true;  
  7.         ……  
  8.         }  
  9.     }</span>  
当点击ActionBar图标的时候,系统同样会调用onOptionsItemSelected()方法,并且此时的itemId是android.R.id.home,所以finish()方法也就是加在这里的了。
现在看上去,ActionBar导航和Back键的功能貌似是一样的。没错,如果我们只是简单地finish了一下,ActionBar导航和Back键的功能是完全一样的,但ActionBar导航的设计初衷并不是这样的,它和Back键的功能还是有一些区别的,举个例子吧。
0 0
原创粉丝点击