【Android Developers Training】 7. 添加Actio

系统 1636 0

注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好。

原文链接: http://developer.android.com/training/basics/actionbar/adding-buttons.html


Action Bar 允许你为和应用当前Context相关的最重要的action事件添加按钮。那些在 Action Bar 中直接显示出来的图标或文字就是所谓的 Action Buttons 。在Action Bar中无法完整显示的或者不是足够重要的操作按钮,都被隐藏在了更多操作这一按钮中,如下图所示:

 图1. 具有一个“搜索”的操作按钮和一个“更多操作”(action overflow)按钮(其中包含了更多的操作)的Action Bar

 

一). 在XML中列举出操作

所有的操作按钮还有其他在更多操按钮中的所有项目,都在一个菜单资源( menu resource )的XML文件中定义。为了把操作添加到Action Bar中,在项目的“ res/menu/ ”目录下创建一个新的XML文件。

为每一个你希望添加到Action Bar中的项目添加一个 <item> 标签。例如:

      
        <
      
      
        menu 
      
      
        xmlns:android
      
      
        ="http://schemas.android.com/apk/res/android"
      
      
        >
      
      
        <!--
      
      
         Search, should appear as action button 
      
      
        -->
      
      
        <
      
      
        item 
      
      
        android:id
      
      
        ="@+id/action_search"
      
      
        

          android:icon
      
      
        ="@drawable/ic_action_search"
      
      
        

          android:title
      
      
        ="@string/action_search"
      
      
        

          android:showAsAction
      
      
        ="ifRoom"
      
      
        />
      
      
        <!--
      
      
         Settings, should always be in the overflow 
      
      
        -->
      
      
        <
      
      
        item 
      
      
        android:id
      
      
        ="@+id/action_settings"
      
      
        

          android:title
      
      
        ="@string/action_settings"
      
      
        

          android:showAsAction
      
      
        ="never"
      
      
        />
      
      
        </
      
      
        menu
      
      
        >
      
    

上述用于声明的代码表明:如果Action Bar的空间充足,那么搜索的操作按钮将会显示,但是设置这一操作的按钮将永远在“更多操作”当中。(所有的操作都会默认的在“更多操作”中显示,但显示地为每个操作声明设计的意图是一个好的习惯)。

下载Action Bar图标:

为了和Android图标风格( iconography )达到完美的视觉效果,建议你使用 Action Bar Icon Pack 提供的图标。

这个“ icon ”属性字段需要一个图像的资源ID。在“ @drawable/ ”之后跟随着的名字必须是一个你在项目工程的“ res/drawable/ ”存储好的一幅位图文件。例如:“ @drawable/ic_action_search ”代表了“ ic_action_search.png ”。类似的,“ title ”属性字段使用的是在项目工程中“ res/values/ ”目录下通过XML文件定义好的字符资源,这些都在 Building a Simple User Interface 有讨论过。(对应博客链接: http://www.cnblogs.com/jdneo/p/3439108.html

Note:

当为你的应用创建图标和其他位图时,一个很重要的事情是你最好为各种分辨率屏幕的设备准备多个版本。这些在课程: Supporting Different Screens 有更多的讨论。

如果你的应用使用了Support Library 来兼容低至Android 2.1版本的系统,“ showAsAction ”这一属性字段并不属于“ android: ”命名空间。不过这个属性字段由 Support Library 来提供,所以你必须定义你自己的XML命名空间,然后使用这个命名空间作为字段的前缀。(一个自定义的XML命名空间最好以你的应用名为基础,当然它可以是你希望的任何名字,并且它的作用域只在你声明它的文件这一范围内)例如:

      
        <
      
      
        menu 
      
      
        xmlns:android
      
      
        ="http://schemas.android.com/apk/res/android"
      
      
        

      xmlns:yourapp
      
      
        ="http://schemas.android.com/apk/res-auto"
      
      
        >
      
      
        <!--
      
      
         Search, should appear as action button 
      
      
        -->
      
      
        <
      
      
        item 
      
      
        android:id
      
      
        ="@+id/action_search"
      
      
        

          android:icon
      
      
        ="@drawable/ic_action_search"
      
      
        

          android:title
      
      
        ="@string/action_search"
      
      
        

          yourapp:showAsAction
      
      
        ="ifRoom"
      
      
        />
      
      
        

    ...


      
      
        </
      
      
        menu
      
      
        >
      
    

 

二). 为Action Bar添加操作

为了将这个菜单项添加进Action Bar,我们需要在你的activity中实现 onCreateOptionsMenu() 这一回调函数,以此来将菜单资源填充进菜单( Menu )对象中,例如:

      
        @Override


      
      
        public
      
      
        boolean
      
      
         onCreateOptionsMenu(Menu menu) {

    
      
      
        //
      
      
         Inflate the menu items for use in the action bar
      
      

    MenuInflater inflater =
      
         getMenuInflater();

    inflater.inflate(R.menu.main_activity_actions, menu);

    
      
      
        return
      
      
        super
      
      
        .onCreateOptionsMenu(menu);

}
      
    

 

三). 操作按钮的响应

当用户按下了其中一个操作按钮,或者“更多操作”中的操作按钮,系统会调用你的activity中的回调函数 onOptionsItemSelected() ,在你这个方法的实现中,对参数 MenuItem 调用 getItemId() 方法来确定是哪个按钮被按下了。返回的资源ID(ResId)是和你在 <item> 标签中“ android:id ”这一属性字段所声明的ID是对应的。

      
        @Override


      
      
        public
      
      
        boolean
      
      
         onOptionsItemSelected(MenuItem item) {

    
      
      
        //
      
      
         Handle presses on the action bar items
      
      
        switch
      
      
         (item.getItemId()) {

        
      
      
        case
      
      
         R.id.action_search:

            openSearch();

            
      
      
        return
      
      
        true
      
      
        ;

        
      
      
        case
      
      
         R.id.action_settings:

            openSettings();

            
      
      
        return
      
      
        true
      
      
        ;

        
      
      
        default
      
      
        :

            
      
      
        return
      
      
        super
      
      
        .onOptionsItemSelected(item);

    }

}
      
    

 

四). 为上一级Activity添加返回操作

图2. Gmail的返回按钮

所有你的应用中非主入口的画面(即指的是除了你的应用的“home”画面外的所有其他画面)必须为用户提供一个导航至应用逻辑层次结构中的父画面,这可以通过让用户按下“Action Bar”中的“返回(Up)”按钮来实现。

当在Android 4.1(API Level 16)或更高的系统版本中运行时,或者使用 Support Library 提供的 ActionBarActivity 时,实现返回的导航功能,只需要你在清单文件中声明父Activity,并且激活action bar的返回按钮。

例如,你可以在清单文件中这样写:

      
        <
      
      
        application 
      
      
        ... 
      
      
        >
      
      
        

    ...

    
      
      
        <!--
      
      
         The main/home activity (it has no parent activity) 
      
      
        -->
      
      
        <
      
      
        activity

        
      
      
        android:name
      
      
        ="com.example.myfirstapp.MainActivity"
      
      
         ...
      
      
        >
      
      
        

        ...

    
      
      
        </
      
      
        activity
      
      
        >
      
      
        <!--
      
      
         A child of the main activity 
      
      
        -->
      
      
        <
      
      
        activity

        
      
      
        android:name
      
      
        ="com.example.myfirstapp.DisplayMessageActivity"
      
      
        

        android:label
      
      
        ="@string/title_activity_display_message"
      
      
        

        android:parentActivityName
      
      
        ="com.example.myfirstapp.MainActivity"
      
      
        >
      
      
        <!--
      
      
         Parent activity meta-data to support 4.0 and lower 
      
      
        -->
      
      
        <
      
      
        meta-data

            
      
      
        android:name
      
      
        ="android.support.PARENT_ACTIVITY"
      
      
        

            android:value
      
      
        ="com.example.myfirstapp.MainActivity"
      
      
        />
      
      
        </
      
      
        activity
      
      
        >
      
      
        </
      
      
        application
      
      
        >
      
    

之后通过调用 setDisplayHomeAsUpEnabled() 来激活返回按钮:

      
        @Override


      
      
        public
      
      
        void
      
      
         onCreate(Bundle savedInstanceState) {

    
      
      
        super
      
      
        .onCreate(savedInstanceState);

    setContentView(R.layout.activity_displaymessage);



    getSupportActionBar().setDisplayHomeAsUpEnabled(
      
      
        true
      
      
        );

    
      
      
        //
      
      
         If your minSdkVersion is 11 or higher, instead use:

    
      
      
        //
      
      
         getActionBar().setDisplayHomeAsUpEnabled(true);
      
      

}
    

因为现在系统知道“ MainActivity ”是“ DisplayMessageActivity ”的父Activity,当用户按下返回按钮,系统将会自动地导航至父Activity,你不需要去对返回按钮做任何事件处理。

阅读 Providing Up Navigation ,获取更多信息。

 

 

【Android Developers Training】 7. 添加Action Buttons


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论