参考《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. Swift 菊花、UIPageControl和UIProgressView

    // Make: 加载 菊花 func _initUIActivityIndicatorView() { let activity = UIActivityIndicatorView(activity ...

  2. Android 百度地图2.4.2版本标注动画效果

    ImageView latestMapEventImageView = null; // 更新震中位置 private void updateMapEventOverlay() { mMapEvent ...

  3. 每天一个linux命令(文件操作):【转载】whiereis命令

    whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数,则返回所有信息. 和find相比,whereis查找的速度非 ...

  4. 1153 Decode Registration Card of PAT (25 分)

    A registration card number of PAT consists of 4 parts: the 1st letter represents the test level, nam ...

  5. 《DSP using MATLAB》示例Example 8.12

    %% ------------------------------------------------------------------------ %% Output Info about thi ...

  6. 【java基础】java集合之HashTable,HashSet,HashMap

    [一]HashSet (1)HashSet内部维护的是一个HashMap,具体原理见java集合之HashMap [二]HashTable (1)HashTable内部维护的是一个Entry的数组.E ...

  7. 【DUBBO】dobbo的application的配置项

    Dubbo:application的配置项[一]:配置项 <dubbo:application name="服务名字" owner="拥有者" organ ...

  8. UML中的几种关系(UML Relationships)

    依赖(Dependency) 依赖可以理解为一个类A使用到了另一个类B,而这种使用关系是具有偶然性的.临时性的.非常弱的,但是B类的变化会影响到A:比如某人要过河,需要借用一条船,此时人与船之间的关系 ...

  9. 编写浏览器和Node.js通用的JavaScript模块

    长期以来JavaScript语言本身不提供模块化的支持, ES6中终于给出了 from, import等关键字来进行模块化的代码组织. 但CommonJS.AMD等规范已经被广为使用,如果希望你的Ja ...

  10. 将SQLite移植到ARM板上 (转)

    SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它, 它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够 ...