2.2 添加action按钮

http://developer.android.com/training/basics/actionbar/adding-buttons.html

摘要:

1 在res/menu添加<item>

2 在activity的onCreateOptionsMenu方法装载图标

3 在activity的onOptionsItemSelected方法实现对action的响应

添加action按钮

开发者可以在action栏中为自己的应用软件添加一系列在运行上下文环境中最常用到的快捷按钮,这些在action栏中以图标或者文字形式呈现的元素即被称为action按钮。其他一些由于action栏空间或者重要性更低的一些功能则被隐藏在action栈内。

图1 包含search按钮和action栈(通常包含一些额外的操作按钮)的action栏

使用XML创建action

所有的action按钮和其他在action栈内包含的条目定义在res/menu下的XML文件中,因此为了给action栏添加action必须首先在该目录下创建一个XML文件。

对于每一个需要添加在action栏中的条目,都需要创建一个对应的<item>,例如

res/menu/main_activity_actions.xml

<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>

上面的代码段声明了search按钮在action栏有足够空间的时候显示为action按钮,而setting按钮只包含在action栈中。默认情况下,所有的按钮都包含在action栈中,但是通过语言显式申明则更能体会开发者的设计意图。

icon属性需要指定一个image的资源ID,跟在@drawable/后面的名称必须与在res/drawable路径下保存的一个bitmap图形文件相对应。例如,"@drawable/ic_action_search"指向ic_action_search.png。类似的,title属性使用了一个string资源,该资源在res/value路径下的一个xml文件中定义(参见创建一个简单的用户界面

注意:为应用软件创建图表或者其他位图文件时,开发者最好能够为不同的屏幕分辨率提供不同的图形文件以达到最佳的显示效果,相关信息参见支持屏幕差异

如果应用软件使用的是兼容Android 2.1版本的支撑库,showAsAction属性则不被android::命名空间支持,而是由支撑库提供,因此开发者必须自行定义自有的XML命名空间,并将此命名空间作为该属性的前缀(虽然定制的XML命名空间可以使用任意名称,仅在明确申明的文件范围内可见,但是推荐开发者基于应用软件名对定制命名空间命名)。

res/menu/main_activity_actions.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添加到action栏

将目录条目添加到action栏,需要为activity实现回调函数onCreateOptionsMenu(),该函数将菜单资源装载到指定的菜单对象,例如

@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); 
}

响应action按钮

当用户点击action按钮或者action栈中的某一条目,系统将会调用activity的onOptionsItemSelected()回调函数。在该函数实现中,通过参数MenuItem的getItemId()方法可以确定当前被按下的是哪个条目——其返回值与之前声明的<item>元素的android::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添加Up按钮

所有非应用软件主界面的用户界面(非“主页”activity)都应该为用户在action栏提供Up按钮,通过该按钮用户能够快速返回到应用软件的上一级界面。

如果应用软件运行在Android 4.1(API Level 16)或者更高版本,或者使用了支撑库的ActionBarActivity,实现Up按钮的快速导航功能仅需要在清单(manifest)文件中声明对应activity的上级activity,然后在action栏使能Up按钮即可。

例如,下面代码展示如何在清单文件中声明一个activity的上级activity

<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()方法使能Up按钮。

@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,当用户按下Up按钮,系统自动将用户导航到MainAcitivy的显示界面,而不需要开发者额外地处理Up按钮的事件。更多关于up导航的信息参见提供Up导航

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值