Android ActionBar示例教程

时间:2020-02-23 14:28:43  来源:igfitidea点击:

今天,我们将研究Android ActionBar。
无论是Web应用程序还是移动应用程序,Action Bar都是任何应用程序的重要组成部分之一。
今天,我们将学习如何使用ActionBar组件在android应用中实现操作列。

Android ActionBar

Android ActionBar是一个菜单列,它贯穿android中的活动屏幕顶部。
Android ActionBar可以包含菜单项,这些菜单项在用户单击"菜单"按钮时变为可见。

通常," ActionBar"包含以下四个组件:

  • 应用程序图标:应用程序品牌徽标或者图标将显示在此处
  • 视图控件:用于显示应用程序标题的专用空间。
    还提供了通过添加微调器或者选项卡式导航在视图之间切换的选项
  • 操作按钮:可以在此处添加应用程序的一些重要操作
  • 动作溢出:所有不重要的动作将显示为菜单

Android ActionBar设置

使用主题Theme.Holo或者派生自Theme.Holo的主题的所有活动将自动包含ActionBar。

Android 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:属性引用可绘制目录中的图标
  • android:showAsAction:此属性指示应如何在操作列中显示给定项目。
    我们可以从以下提到的任何标志中进行选择:始终始终将其保留在ActionBar中
  • ifRoom仅在有可用空间时保留它
  • 从不意味着菜单项不会作为图标放置在ActionBar中。
    只有在弹出菜单中单击菜单按钮时,该菜单才会显示
  • | withText:我们可以将其附加到always或者ifRoom上,以指示工具列按钮既是图标又是标题,而不仅仅是图标

请注意,始终不能保证始终将其作为工具列按钮-如果您要求提供100个始终项,则将没有空间容纳所有这些项目。
但是,"总是"项在操作列中的空间优先于" ifRoom"项。

将菜单扩展到Android ActionBar

为了显示菜单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文件的常数。
menu参数是我们要其中添加菜单项的菜单。

响应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 ActionBar示例代码

我们已经在MainActivity中实现了四个菜单项,如下面的代码片段所示:

MainActivity.java

package com.theitroad.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"内容,在第三个项目中显示祝酒词,并在第四个项目中退出应用程序。

请注意,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操作列向后移植

  • 由于ActionBar是在Android Honeycomb 3.0之后引入的,因此要在minSdkVersion为11或者更小时实现ActionBar,我们需要将app-compat-v7 jar导入到gradle中,因为我们这样做是为了实现向后兼容
  • 另一种方法是使用ActionBarSherlock导入和扩展MainActivity,而独立于操作列的反向端口,因为此类是在Android 3.0之后引入的

下图显示了我们的项目产生的输出,您可以看到ActionBar包含预定义的图标。
自从单击添加图标以来,textview会更新内容。
自单击重置后,文本视图会将内容还原为原始内容。
单击"关于"时,将显示toast通知。