Android 4 学习(20):ActionBar

参考《Pro Android 4.0

ActionBar

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

 

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

 

创建一个不显示ActionBarTheme

 

<?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. } }

 

TabListenerTab绑定在一起:

 

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所在GroupID

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

3. MenuItem在组内的顺序

4. MenuItem显示的文本

获取已创建的MenuItem

 

MenuItem menuItem = menu.findItem(MENU_ITEM); 

 

设置MenuItem的显示方式

使用setShowAsActionFlags 方法,可以设置MenuItemActionBar中的显示:

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

更常用的方法是重写ActivityonCreateContextMenu方法,然后在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;
    } }
});

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/jubincn/p/3522513.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机WIN7动态硬盘分区,win7硬盘分区教程

win7硬盘分区教程硬盘分区其实是对硬盘的一种格式化&#xff0c;进行了此步骤后才可以使用硬盘保存各种数据&#xff0c;下面是小编为大家详细介绍win7硬盘分区教程&#xff0c;欢迎大家阅读&#xff01;一、进入磁盘管理工具我们点击要对硬盘进行分区&#xff0c;我们首先得知…

一个经典的对象级别插件的开发

先新建一个js&#xff0c;名为jquery.lifocuscolor.js&#xff0c;编写一下代码&#xff1a; (function($) { $.fn.extend({ "focusColor": function(li_col) { var def_col "#ccc"; //默认获取焦点的色值 var lst_col "#fff"; //默认丢失焦点…

计算机的alu的作用,算术逻辑运算单元(ALU)的基本功能是什么 – 手机爱问

2004-12-28解释定点运算器的功能和组成部件解释定点算器包括ALU\阵列乘除器\寄存器\多路开关\三态缓冲器\数据总线等逻辑部件。运算器的设计,主要是围绕ALU和寄存器同数据总线之间如何传送操作数和运算结果进行的。在决定方案时,需要考虑数据传送的方便性和操作速度,在微型机和…

asp.net返回值当文件下载问题

mvc中返回的javascript当做文件下载 解决方案 Response.ContentEncoding System.Text.Encoding.UTF8; Response.ContentType "text/html"; 或者使用 Page.ClientScript.RegisterClientScriptBlock &#xff08;上面两句话就不用写了&#xff09;转载于:https://ww…

SQL中的left outer join,inner join,right outer join用法

使用关系代数合并数据1 关系代数合并数据集合的理论基础是关系代数&#xff0c;它是由E.F.Codd于1970年提出的。在关系代数的形式化语言中&#xff1a;? 用表、或者数据集合表示关系或者实体。? 用行表示元组。? 用列表示属性。关系代数包含以下…

笔记本上的小键盘计算机怎样用,笔记本数字小键盘不能用怎么办【解决方法】...

许多笔记本键盘中都会携带一个小键盘&#xff0c;与台式电脑的键盘大小差不多&#xff0c;小键盘上面标注着阿拉伯数字0到9&#xff0c;非常适合会计行业的人们使用。小键盘可以帮助人们快速地将数字敲打出来&#xff0c;使用起来极为方便。要知道&#xff0c;大键盘属于输入设…

PHP json_encode

草稿 <?php$demo1 array(result >true ); echo json_encode($demo1);//{"result":true}$picsListarray("countTotal">2,"list"> array(array(name >orabge.jpg,size>1233123),array(name >apple.jpg ,size>73878 )) )…

计算机的防呆接口,电脑上有哪些“防呆设计”

02电脑上有哪些“防呆设计”先看CPU&#xff0c;所有电脑硬件中&#xff0c;CPU可以说是最昂贵的部件&#xff0c;也是最脆弱的部件&#xff0c;稍有不慎就有可能损坏。无论是Intel还是AMD的CPU都是四四方方的&#xff0c;一面有针脚(Intel针脚在主板上&#xff0c;AMD针脚在CP…

批量Append

GIS数据是按照图幅号组织的&#xff0c;现需要每个单独的系统数据进行拼接。 以下是批量追加代码&#xff1a; # --------------------------------------------------------------------------- # Append.py # Created on: 2013-01-21 10:25:22.00000 # (generated by ArcGI…

jquery ajax php中 css样式不显示,Chrome浏览器在Ajax同步调用之前不会显示Jquery的动态css Propery更改...

我有如下因素HTML节点&#xff1a;上的click事件会触发聊天对象的方法this.addUser function(trigger_node, id, is_silent, session, show_block_message){if(trigger_node){this.bk_trigger_node.html trigger_node.innerHTML;this.bk_trigger_node.cn trigger_node.class…

Silverlight与Asp.net之间的调用及参数传递

共有两种方式来传递初始化参数 1)在html或者aspx页面中object对象中加入一下代码 参数格式&#xff1a;参数名 值&#xff0c;参数名 值&#xff0c;... <param name"initParams" value "name John , sex m"/> 取得参数的方法 在app页面中…

email协议与服务器关系,常见的邮件协议:POP3、IMAP、SMTP之间的区别和联系

POP3POP3是Post Office Protocol 3的简称&#xff0c;即邮局协议的第3个版本&#xff0c;是TCP/IP协议族中的一员&#xff0c;主要用于支持使用客户端远程管理在服务器上的电子邮件。POP3是因特网电子邮件的第一个离线协议标准&#xff0c;允许用户从服务器上把邮件存储到本地主…

php 连接mssql

以前用的都是mysql&#xff0c;今天突然想用下mssql&#xff0c;起先用的是sql server200. 第一种方法 打开mssql.dll拓展。然后把mssql.secure_connection off改为on 使用mssql拓展。类似于mysql拓展库 $connmssql_connect((local),sa,); if(!$conn){ //die(mssql_error()); …

2013年未之wpf项目乱述

不知识为何现已很少在网上发帖,貌似人生的方向已经看的七七八八.要么用心工作,要么自主创业.无论怎么样,对于现在的我来说都是一种淡定的选择。作为一个c#程序员&#xff0c;今年下半年开始使用wpf&#xff0c;更觉得wpf将来肯定会是win 客户端上的首选技术。 今年在公司共用wp…

Silverlight 出现“无法加载 URI 的内容。URI 可能无效”错误的解决方案

在程序操作过程中偶尔会出现如标题所示的错误&#xff0c;开始一直不知道怎么回事&#xff0c;后来仔细调试了下&#xff0c;发现是在浏览器可以点击“前进/后退”按钮时&#xff0c;同时按住shift鼠标滚轮滚动会出现这个Bug。 上网查找了下&#xff0c;有些浏览器Shift鼠标滚轮…

asp.net之动态页面和静态页面的区别

asp.net之动态页面和静态页面的区别 当我开始接触web开发的时候&#xff0c;首先学到的是html、css、js这一类网页语言&#xff0c;通过布局可以搭建出一个静态网站&#xff0c;效果也跟我们上网时经常看到的一些网站一样了。于是都感觉很有成就感了。 可是什么又是动态语言呢?…

GeoPoint与LocationData

生成GeoPoint&#xff1a; new GeoPoint((int)(locData.latitude* 1e6), (int)(locData.longitude* 1e6)) Done&#xff01;转载于:https://www.cnblogs.com/xingyyy/p/3538983.html

原型对象prototype和原型属性[[Prototype]]

构造器&#xff1a;可以被 new 运算符调用, Boolean,Number,String,Date,RegExp,Error,Function,Array,Object 都是构造器&#xff0c;他们有各自的实现方式。 比如&#xff1a;var snew String("test") s的 [[Prototype]] 内部属性设定为标准内置的字符串原型对象&a…

(转) PowerDesigner中Table视图同时显示Code和Name

PowerDesigner中Table视图同时显示Code和Name,像下图这样的效果&#xff1a; 实现方法&#xff1a;Tools-Display Preference 转载于:https://www.cnblogs.com/wallis0922/p/3548402.html

Linux下部署Hadoop伪分布模式

Hadoop版本为1.2.1 Distribution为Fedora19并使用hadoop账号安装 第一步&#xff1a;配置ssh本地登录证书&#xff08;虽然为伪分布模式&#xff0c;Hadoop依然会使用SSH进行通信&#xff09; [hadooppromote ~]$ which ssh /usr/bin/ssh [hadooppromote ~]$ which ssh-keygen …