Android ActionBar 示例教程
今天我们将探讨Android的操作栏(ActionBar)。操作栏是任何应用程序的重要部分,无论是Web应用还是移动应用。今天我们将学习如何使用ActionBar组件在Android应用程序中实现操作栏。
安卓的操作栏
安卓的ActionBar是安卓活动屏幕顶部横跨的菜单栏。安卓的ActionBar可以包含菜单项,在用户点击“菜单”按钮时可见。一般而言,一个ActionBar由以下四个组件组成:
- App Icon: App branding logo or icon will be displayed here
- View Control: A dedicated space to display Application title. Also provides option to switch between views by adding spinner or tabbed navigation
- Action Buttons: Some important actions of the app can be added here
- Action Overflow: All unimportant action will be shown as a menu
Android操作栏设置
所有使用Theme.Holo主题或派生于Theme.Holo主题的活动都会自动包含一个ActionBar。
安卓操作栏菜单
将工具栏图标和操作溢出项添加到操作栏的最简单方法是创建位于res/menu文件夹中的菜单XML资源文件。我们可以按照以下方式将菜单项添加到该文件夹中的原始XML文件中:menu_main.xml。
<menu xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto"
xmlns:tools="https://schemas.android.com/tools" tools:context=".MainActivity">
<item
android:id="@+id/add" android:icon="@android:drawable/ic_menu_add" app:showAsAction="always" android:title="@string/add"/>
<item
android:id="@+id/reset" android:icon="@android:drawable/ic_menu_revert" app:showAsAction="always|withText" android:title="@string/reset"/>
<item
android:id="@+id/about" android:icon="@android:drawable/ic_dialog_info" app:showAsAction="never" android:title="@string/about">
</item>
<item
android:id="@+id/exit" app:showAsAction="never" android:title="@string/exit">
</item>
</menu>
每个菜单项需要配置四个事项。
-
- android:id属性指定了菜单项的id。这与Android应用中的其他地方的id一样工作。以@+id/开头的android:id值将在R.menu常量集合中创建一个常量
-
- android:title属性值包含了菜单项的标题
-
- android:icon属性引用了drawable目录中的图标
-
- android:showAsAction属性指示给定的项在操作栏中应该如何展示。我们可以从以下任一标志中选择:
always:始终将其保留在操作栏中
ifRoom:当有空间时才保留
never:意味着该菜单项不会作为图标放置在操作栏中。它只会在单击菜单按钮时,在弹出的菜单中可见
|withText:我们可以将其附加到always或ifRoom,表示工具栏按钮既是图标又是标题,而不仅仅是图标
请注意,始终(always)并非保证会作为一个工具栏按钮存在 – 如果您要求始终(always)显示100个项目,将无法容纳它们所有。然而,始终(always)项目在操作栏中具有比ifRoom(如果有空间)项目更高的优先级,以便占用空间。
将菜单扩展至Android的操作栏中
为了显示在菜单XML文件中定义的菜单项,您需要加载该菜单文件。我们可以在希望添加ActionBar的活动的onCreateOptionsMenu()方法中进行此操作。以下是代码片段:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
R.menu.menu_main参数是指向菜单XML文件的常量。菜单参数是我们希望填充菜单项的菜单。
响应Android操作栏事件
为了找出用户何时点击这些东西,我们需要覆盖MainActivity中的onOptionsItemSelected()方法,如下所示:
@Override
public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) {
case R.id.add:
//add the function to perform here
return(true);
case R.id.reset:
//add the function to perform here
return(true);
case R.id.about:
//add the function to perform here
return(true);
case R.id.exit:
//add the function to perform here
return(true);
}
return(super.onOptionsItemSelected(item));
}
现在让我们给项目中的每个菜单项分配一些基本功能。
项目结构
Android动作栏示例代码
我们已经在MainActivity中按照下面代码片段所示实现了四个菜单项:MainActivity.java
package com.Olivia.actionbar;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
TextView count;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) {
case R.id.add:
count=(TextView)findViewById(R.id.textView);
count.setText("Add is clicked");
return(true);
case R.id.reset:
count=(TextView)findViewById(R.id.textView);
count.setText("Nothing is selected");
return(true);
case R.id.about:
Toast.makeText(this, R.string.about_toast, Toast.LENGTH_LONG).show();
return(true);
case R.id.exit:
finish();
return(true);
}
return(super.onOptionsItemSelected(item));
}
}
各个项目被分配了相应的功能。所选项目是通过在menu_main.xml文件中定义的id确定的。这里我们只是改变第一个和第二个项目中的TextView内容,在第三个项目中显示一个toast,在第四个项目中退出应用程序。请注意,AppCompatActivity是ActionBarActivity的一个替代版本。styles.xml文件定义如下:
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
</style>
</resources>
你可以看到,父主题使用了Theme.AppCompat的一个衍生版本,该版本默认包含ActionBar(除非使用Theme.AppCompat.Light.NoActionBar类)。因此在这里没有必要显式地定义它。
安卓操作栏的后移搭建
-
- 自从Android Honeycomb 3.0之后引入了ActionBar,如果minSdkVersion小于或等于11,我们需要导入app-compat-v7 jar到我们的gradle中以实现ActionBar,就像我们在这里所做的一样,以启用向后兼容性。
- 另一种方法是独立于操作栏补丁,导入并扩展MainActivity与ActionBarSherlock类,因为这个类是在Android 3.0之后引入的。
下图显示了我们项目生成的输出结果。您可以看到ActionBar包含了预定义的图标。当点击添加图标时,TextView更新内容。当点击重置时,TextView将内容恢复到原始状态。当点击关于时,如下所示出现toast通知。这就结束了关于Android ActionBar示例教程的介绍。您还应该阅读有关Android自定义ActionBar的内容。您可以从以下链接下载Android ActionBar项目。
下载Android ActionBar实例项目