参考《Pro Android 4.0》

ActionBar

11.0之后,ActionBar在Activity中默认存在,可以在代码中设置其显示与否:

ActionBar actionBar = getActionBar();
// Hide the Action Bar actionBar.hide();
// Show the Action Bar actionBar.show();

也可以在Manifest中设置是否显示ActionBar:

<activity  android:name=”.MyNonActionBarActivity” android:theme=”@android:style/Theme.Holo.NoActionBar”> 

创建一个不显示ActionBar的Theme:

<?xml version=”1.0” encoding=”utf-8”?> 
<resources>
  <style name=”NoActionBar” parent=”@style/ActivityTheme”>
    <item name=”android:windowActionBar”>false</item>
  </style>
</resources>

ActionBar的其他设置:

ActionBar actionBar = getActionBar();
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayUseLogoEnabled(displayLogo);
actionBar.setDisplayShowHomeEnabled(false);
actionBar.setSubtitle(“Inbox”);
actionBar.setTitle(“Label:important”);
Resources r = getResources();Drawable myDrawable = r.getDrawable(R.drawable.gradient_header); actionBar.setBackgroundDrawable(myDrawable);
//ActionBar float above content
@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
  setContentView(R.layout.main);
}

使用ActionBar做导航

新建一个Tab:

Tab tabOne = actionBar.newTab();
tabOne.setText(“First Tab”).setIcon(R.drawable.ic_launcher).setContentDescription(“Tab the First”).setTabListener(
  new TabListener<MyFragment>(this, R.id.fragmentContainer, MyFragment.class));
actionBar.addTab(tabOne);

实现TabListener接口:

public static class TabListener<T extends Fragment>  implements ActionBar.TabListener {
  private MyFragment fragment;
  private Activity activity;
  private Class<T> fragmentClass;
  private int fragmentContainer;
  public TabListener(Activity activity, int fragmentContainer, Class<T> fragmentClass) {
    this.activity = activity;
    this.fragmentContainer = fragmentContainer;
    this.fragmentClass = fragmentClass;
  }
  // Called when a new tab has been selected
public void onTabSelected(Tab tab, FragmentTransaction ft) {
  if (fragment == null) {
    String fragmentName = fragmentClass.getName();
    fragment = (MyFragment)Fragment.instantiate(activity, fragmentName);
    ft.add(fragmentContainer, fragment, null);
    fragment.setFragmentText(tab.getText());
  } else {
    ft.attach(fragment);
  }
}
  // Called on the currently selected tab when a different tag is selected.
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
  if (fragment != null) {
    ft.detach(fragment);
  }
}
// Called when the selected tab is selected.public void onTabReselected(Tab tab, FragmentTransaction ft) {
// TODO React to a selected tab being selected again. }
}

将TabListener与Tab绑定在一起:

Tab tabOne = actionBar.newTab();
TabListener<EarthquakeListFragment> listTabListener = new TabListener<EarthquakeListFragment>(this, R.id.EarthquakeFragmentContainer, EarthquakeListFragment.class);
tabOne.setTabListener(listTabListener);

使用下拉框导航:

actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
ArrayList<CharSequence> al = new ArrayList<CharSequence>();
al.add(“Item 1”);al.add(“Item 2”);
ArrayAdapter<CharSequence> dropDownAdapter = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_list_item_1, al);
// Select the drop-down navigation mode.
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
// Create a new Spinner Adapter that contains the values to be displayed in the drop down.
ArrayAdapter dropDownAdapter = ArrayAdapter.createFromResource(this, R.array.my_dropdown_values, android.R.layout.simple_list_item_1);
// Assign the callbacks to handle drop-down selections.
actionBar.setListNavigationCallbacks(dropDownAdapter, new OnNavigationListener() {
    public boolean onNavigationItemSelected(int itemPosition, long itemId) {
    // TODO Modify your UI based on the position of the drop down item selected.
      return true; }
});

使用菜单和ActionBar Item

Android Actionbar中常用的Menu类型:

1. Icon Menu:在ActionBar中以图标形式显示的Menu

2. Expanded and overflow Menu: 点击more出现的菜单,显示文本而不是图标。

3. Submenu

创建菜单

重写Activity中的onCreateOptionMenus方法可以创建菜单:

static final private int MENU_ITEM = Menu.FIRST;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
  super.onCreateOptionsMenu(menu);
  // Group ID
  int groupId = 0;
  // Unique Menu Item identifier. Used for event handling
  int menuItemId = MENU_ITEM;
  // The order position of the item
  int menuItemOrder = Menu.NONE;
  // Text to be displayed for this Menu Item
  int menuItemText = R.string.menu_item;
  // Create the Menu Item and keep a reference to it
  MenuItem menuItem = menu.add(groupId, menuItemId, menuItemOrder, menuItemText);
  return true;
}

创建MenuItem的几个参数:

1. MenuItem所在Group的ID

2. MenuItem的ID,后面可以用findItem方法获取对应的MenuItem

3. MenuItem在组内的顺序

4. MenuItem显示的文本

获取已创建的MenuItem:

MenuItem menuItem = menu.findItem(MENU_ITEM); 

设置MenuItem的显示方式

使用setShowAsActionFlags 方法,可以设置MenuItem在ActionBar中的显示:

SHOW_AS_ACTION :永远在ActionBar中显示

SHOW_AS_IF_SPACE :当ActionBar有空白位置的时候显示

MenuItem类型

1. CheckBox:

// Create a new check box item.
menu.add(0, CHECKBOX_ITEM, Menu.NONE, “CheckBox”).setCheckable(true);

2. Radio Buttons:

// Create a radio button group.
menu.add(RB_GROUP, RADIOBUTTON_1, Menu.NONE, “Radiobutton 1”);
menu.add(RB_GROUP, RADIOBUTTON_2, Menu.NONE, “Radiobutton 2”);
menu.add(RB_GROUP, RADIOBUTTON_3, Menu.NONE, “Radiobutton 3”).setChecked(true);

3. 快捷键

// Add a shortcut to this Menu Item, ‘0’ if using the numeric keypad or ‘b’ if using the full keyboard.
menuItem.setShortcut(‘0’, ‘b’);

4. Condensed Title (Condensed Title是指在icon menu的状态下显示的标题,在扩展(more)那里会显示全标题。)

menuItem.setTitleCondensed(“Short Title”); 

5. icon

menuItem.setIcon(R.drawable.menu_item_icon); 

6. MenuItem Click Listener

menuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() { 
  public boolean onMenuItemClick(MenuItem _menuItem) {
    [ ... execute click handling, return true if handled ... ]
    return true;
  }
});

7. Intent

menuItem.setIntent(new Intent(this, MyOtherActivity.class)); 

Action View

menuItem.setActionView(R.layout.my_action_view).setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM|MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); 

可以在ActionView中加Button等控件:

View myView = menuItem.getActionView();
Button button = (Button)myView.findViewById(R.id.goButton);
button.setOnClickListener(new OnClickListener() {
  public void onClick(View v) {
  // TODO React to the button press. }
});

从Fragment中获取Menu Item:

在Fragment中调用setHasOptionsMenu方法,可以告诉Activity这个Fragment中含有MenuItem,从而使Activity获得并显示这些MenuItem。

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setHasOptionsMenu(true);
}

使用XML定义MenuItem

这是目前比较推荐的添加MenuItem的方法,在res/menu中创建XML文件并将MenuItem定义写入此XML:

<menu xmlns:android=”http://schemas.android.com/apk/res/android”> 
  <item android:id=”@+id/action_item”
      android:icon=”@drawable/action_item_icon”
      android:title=”@string/action_item_title”
      android:showAsAction=”ifRoom”>
  </item>
  <item android:id=”@+id/action_view_item”
      android:icon=”@drawable/action_view_icon”
      android:title=”@string/action_view_title”
      android:showAsAction=”ifRoom|collapseActionView”
      android:actionLayout=”@layout/my_action_view”>
  </item>
  <item android:id=”@+id/action_provider_item”
      android:title=”Share”
      android:showAsAction=”always”
      android:actionProviderClass=”android.widget.ShareActionProvider”>
  </item>
  <item android:id=”@+id/item02”
      android:checkable=”true”
      android:title=”@string/menu_item_two”>
  </item>
  <item android:id=”@+id/item03”
      android:numericShortcut=”3”
      android:alphabeticShortcut=”3”
      android:title=”@string/menu_item_three”>
  </item>
  <item android:id=”@+id/item04”
      android:title=”@string/submenu_title”>
    <menu>
      <item android:id=”@+id/item05”
          android:title=”@string/submenu_item”>
      </item>
    </menu>
  </item>
</menu>

然后,在onCreateOptionsMenu中创建Menu:

public boolean onCreateOptionsMenu(Menu menu) {
  super.onCreateOptionsMenu(menu);
  MenuInflater inflater = getMenuInflater();
  inflater.inflate(R.menu.my_menu, menu);
  return true;
}

响应Menu选择事件

Activity中所有的Menu事件都是放在onOptionsItemSelected 中一起处理的:

public boolean onOptionsItemSelected(MenuItem item) {
  super.onOptionsItemSelected(item);
  // Find which Menu Item has been selected
  switch (item.getItemId()) {
    // Check for each known Menu Item
    case (MENU_ITEM):
    [ ... Perform menu handler actions ... ]
      return true;
    // Return false if you have not handled the Menu Item
    default:
      return false;
  }
}

子菜单和环境菜单

创建子菜单:

SubMenu sub = menu.addSubMenu(0, 0, Menu.NONE, “Submenu”); 
sub.setHeaderIcon(R.drawable.icon); sub.setIcon(R.drawable.icon);
MenuItem submenuItem = sub.add(0, 0, Menu.NONE, “Submenu Item”);

使用环境菜单和弹出菜单:

一种方法是重写View中的onCreateContextMenu方法,这样任何包含这个View的Activity都会包含这个上下文菜单。

@Override
public void onCreateContextMenu(ContextMenu menu) {
  super.onCreateContextMenu(menu);
  menu.add(“ContextMenuItem1”);
}

更常用的方法是重写Activity的onCreateContextMenu方法,然后在onCreate方法中调用.

registerForContextMenu(view):
@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  EditText view = new EditText(this);
  setContentView(view);
  registerForContextMenu(view);
} @Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
  super.onCreateContextMenu(menu, v, menuInfo);
  menu.setHeaderTitle(“Context Menu”);
  menu.add(0, Menu.FIRST, Menu.NONE, “Item 1”).setIcon(R.drawable.menu_item);
  menu.add(0, Menu.FIRST+1, Menu.NONE, “Item 2”).setCheckable(true);
  menu.add(0, Menu.FIRST+2, Menu.NONE, “Item 3”).setShortcut(‘3’, ‘3’);
  SubMenu sub = menu.addSubMenu(“Submenu”);sub.add(“Submenu Item”);
}

这样,在registerForContextMenu中注册的View中长按屏幕时,就会出现这个环境菜单。

弹出菜单

创建弹出菜单并绑定到View:

final PopupMenu popupMenu = new PopupMenu(this, myView); 

创建弹出菜单并绑定到Button:

final PopupMenu popupMenu = new PopupMenu(this, button);
popupMenu.inflate(R.menu.my_popup_menu);
popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
  public boolean onMenuItemClick(MenuItem item) {
    switch (item.getItemId()) {
      case (POPUP_ITEM_1) :
      // TODO Handle popup menu clicks.
        return true;
      default:
        return false;
    }
  }
});

Android 4 学习(20):ActionBar的更多相关文章

  1. Android自动化学习笔记:编写MonkeyRunner脚本的几种方式

    ---------------------------------------------------------------------------------------------------- ...

  2. Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab

     今天我们要实现的这个效果呢,在Android的应用中十分地常见,我们可以看到下面两张图,无论是系统内置的联系人应用,还是AnyView的阅读器应用,我们总能找到这样的影子,当我们滑动屏幕时,Tab可 ...

  3. Android开发学习之LauncherActivity开发启动的列表

    Android开发学习之LauncherActivity开发启动的列表 创建项目:OtherActivity 项目运行结果:   建立主Activity:OtherActivity.java [jav ...

  4. Android Animation学习(二) ApiDemos解析:基本Animatiors使用

    Animator类提供了创建动画的基本结构,但是一般使用的是它的子类: ValueAnimator.ObjectAnimator.AnimatorSet ApiDemos中Animation部分是单独 ...

  5. Android 布局学习之——Layout(布局)具体解释二(常见布局和布局參数)

     [Android布局学习系列]   1.Android 布局学习之--Layout(布局)具体解释一   2.Android 布局学习之--Layout(布局)具体解释二(常见布局和布局參数)   ...

  6. Android开发学习之路--网络编程之xml、json

    一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载 ...

  7. Android开发学习之路--UI之简单聊天界面

    学了很多的ui的知识,这里就来实现个聊天的界面,首先来实现个layout的xml,代码如下: <?xml version="1.0" encoding="utf-8 ...

  8. Android开发学习之路--UI之ListView

    这里再学习写android的ListView,其实我们都使用过ListView,就像手机的联系人,就是用的ListView了.下面就实现下简单的ListView吧,首先是xml文件中添加相关的代码: ...

  9. Android开发学习之路--Activity之Intent

    窗外再次飘起了小雪,还有1周就过年了,2016年即将到来,来年不知道自己将身处何处,船到桥头自然直吧.还是继续学习吧,上次学习了Activity,那么如果是两个Activity之间,怎么从一个Acti ...

随机推荐

  1. EP-N8530S USB WIFI 驱动移植

    /*********************************************************************** * EP-N8530S USB WIFI 驱动移植 * ...

  2. Android编程实例-获取当前进程名字

    下面代码是根据进程id获取进程名字: /** * 根据Pid获取当前进程的名字,一般就是当前app的包名 * * @param context 上下文 * @param pid 进程的id * @re ...

  3. get、post接口测试-java

    public class HttpClient { //get请求方法 public String sendGet(String url, String data) { Date date = new ...

  4. 每天一个linux命令:【转载】less命令

    less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性.在 more 的时候,我们并没有办法向前面翻 ...

  5. 电源lc滤波及单点接地(转载)

    1.在一个高速数字电路设计里面,看到在电源部分进行了如下的处理.不过怎么都不能理解,如果说1uF和0.1uF电容并联,这块处理是一个经验值.那么前面的LC滤波参数,参数又是如何确定的?DVDD-in输 ...

  6. simulink中几个bit型操作模型

    bit concat  将两个fix point 数据 结合到一块. bit rotate 循环移位 bit shift 移位 又分逻辑移位和算术移位,逻辑移位不管最高位0或1,统统移0,算术移位会移 ...

  7. hapi lab测试框架简单使用

    1. 依赖安装 yarn init yarn add lab code 2. 基本模式 const Lab = require('lab'); const Code = require('code') ...

  8. wekan 工具配置

    1. 安装     使用docker-compose 安装,主要是方便简单,后期维护比较简单    2. 配置     docker-compose.yaml  文件 version: '2' ser ...

  9. 最短路径问题的Dijkstra算法

      问题 最短路径问题的Dijkstra算法 是由荷兰计算机科学家艾兹赫尔·戴克斯特拉提出.迪科斯彻算法使用了广度优先搜索解决非负权有向图的单源最短路径问题,算法终于得到一个最短路径树>    ...

  10. MyEclipse项目突然报错JavanotFindClassException

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/UP19910522/article/details/25985277 好好的项目.从SVN检出到本地 ...