原文:郭霖的博客
http://blog.csdn.net/guolin_blog/article/details/18234477
源代码:
http://download.csdn.net/download/u011109881/10150399

demo1(xml和图片就不贴了)

public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 代码隐藏ActionBar// ActionBar actionBar = getActionBar();// actionBar.hide();// 启用ActionBar图标导航的功能,可以允许用户根据当前应用的位置来在不同界面之间切换。// 比如,A界面展示了一个列表,点击某一项之后进入了B界面,这时B界面就应该启用ActionBar图标导航功能,这样就可以回到A界面。ActionBar actionBar = getActionBar();actionBar.setDisplayHomeAsUpEnabled(true);setOverflowShowingAlways();}// overflow中的Action按钮应不应该显示图标,是由MenuBuilder这个类的setOptionalIconsVisible方法来决定的// 如果我们在overflow被展开的时候给这个方法传入true,那么里面的每一个Action按钮对应的图标就都会显示出来了。// 调用的方法当然仍然是用反射了@Overridepublic boolean onMenuOpened(int featureId, Menu menu) {if (featureId == Window.FEATURE_ACTION_BAR && menu != null) {if (menu.getClass().getSimpleName().equals("MenuBuilder")) {try {Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);m.setAccessible(true);m.invoke(menu, true);} catch (Exception e) {}}}return super.onMenuOpened(featureId, menu);}// 通过反射 解决有的机器,overflow菜单按menu键显示在下方的问题private void setOverflowShowingAlways() {try {ViewConfiguration config = ViewConfiguration.get(this);// 让系统固定认为没有物理menu按钮(android系统通过判断有没有物理按钮来决定overflow是否显示)Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");menuKeyField.setAccessible(true);menuKeyField.setBoolean(config, false);} catch (Exception e) {e.printStackTrace();}}// 想要显示ActionBar上的按钮要重写的方法@Overridepublic boolean onCreateOptionsMenu(Menu menu) {MenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.main, menu);// 如果你希望在代码中对SearchView的属性进行配置(比如添加监听事件等),// 需要在onCreateOptionsMenu()方法中获取该ActionView的实例就可以了MenuItem searchItem = menu.findItem(R.id.action_search);SearchView searchView = (SearchView) searchItem.getActionView();// 下面配置SearchView的属性// 参见http://developer.android.com/guide/topics/search/search-dialog.html// ...// 监听search view 打开关闭searchItem.setOnActionExpandListener(new OnActionExpandListener() {@Overridepublic boolean onMenuItemActionExpand(MenuItem item) {Toast.makeText(MainActivity.this, "onMenuItemActionExpand",Toast.LENGTH_SHORT).show();return true;}@Overridepublic boolean onMenuItemActionCollapse(MenuItem item) {Toast.makeText(MainActivity.this, "onMenuItemActionCollapse",Toast.LENGTH_SHORT).show();return true;}});return super.onCreateOptionsMenu(menu);}// 当用户点击Action按钮的时候,系统会调用Activity的onOptionsItemSelected()方法,// 通过方法传入的MenuItem参数,我们可以调用它的getItemId()方法和menu资源中的id进行比较,从而辨别出用户点击的是哪一个Action按钮@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {// ActionBar图标的左侧出现了一个向左的箭头,通常情况下这都表示返回的意思,该按钮的id固定为android.R.id.home// ActionBar的导航还不是很明白 原文中实现需要三步// http://blog.csdn.net/guolin_blog/article/details/18234477case android.R.id.home:finish();return true;case R.id.action_compose:Toast.makeText(this, "Compose", Toast.LENGTH_SHORT).show();Intent intent = new Intent(MainActivity.this, Activity2.class);startActivity(intent);return true;case R.id.action_delete:Toast.makeText(this, "Delete", Toast.LENGTH_SHORT).show();return true;case R.id.action_settings:Toast.makeText(this, "Settings", Toast.LENGTH_SHORT).show();return true;default:return super.onOptionsItemSelected(item);}}
}
public class Activity2 extends Activity{@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 启用ActionBar图标导航的功能,可以允许用户根据当前应用的位置来在不同界面之间切换。// 比如,A界面展示了一个列表,点击某一项之后进入了B界面,这时B界面就应该启用ActionBar图标导航功能,这样就可以回到A界面。ActionBar actionBar = getActionBar();actionBar.setDisplayHomeAsUpEnabled(true);}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {// ActionBar图标的左侧出现了一个向左的箭头,通常情况下这都表示返回的意思,该按钮的id固定为android.R.id.homecase android.R.id.home:finish();return true;default:return super.onOptionsItemSelected(item);}}}

demo2

public class AlbumFragment extends Fragment {  @Override  public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState) {  TextView textView = new TextView(getActivity());  textView.setText("Album Fragment");  textView.setGravity(Gravity.CENTER_HORIZONTAL);  LinearLayout layout = new LinearLayout(getActivity());  LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);  layout.addView(textView, params);  return layout;  }  } 
public class AltistFragment extends Fragment {  @Override  public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState) {  TextView textView = new TextView(getActivity());  textView.setText("Altist Fragment");  textView.setGravity(Gravity.CENTER_HORIZONTAL);  LinearLayout layout = new LinearLayout(getActivity());  LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);  layout.addView(textView, params);  return layout;  }  }  
public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);setTitle("天气天气天气天气天气天气天气天气天气天气天气天气天气天气天气天气天气天气天气天气天气");//自定义actionBar布局ActionBar actionBar = getActionBar();if (actionBar != null) {actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); //Enable自定义的ViewactionBar.setCustomView(R.layout.actionbar_custom);//设置自定义的布局:actionbar_custom}//setOverflowShowingAlways();actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);Tab tab = actionBar.newTab().setText("artistxx").setTabListener(new TabListener<AltistFragment>(this, "artist",AltistFragment.class));actionBar.addTab(tab);tab = actionBar.newTab().setText("albumxx").setTabListener(new TabListener<AlbumFragment>(this, "album",AlbumFragment.class));actionBar.addTab(tab);}// 由于每个Action Provider都可以自由地控制事件响应,// 所以它们不需要在onOptionsItemSelected()方法中再去监听点击事件,// 而是应该在onPerformDefaultAction()方法中去执行相应的逻辑// onCreateOptionsMenu()中调用MenuItem的getActionProvider()方法// 来得到该ShareActionProvider对象,// 再通过setShareIntent()方法去选择构建出什么样的一个Intent@Overridepublic boolean onCreateOptionsMenu(Menu menu) {MenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.main, menu);MenuItem shareItem = menu.findItem(R.id.action_share);ShareActionProvider provider = (ShareActionProvider) shareItem.getActionProvider();provider.setShareIntent(getDefaultIntent());return super.onCreateOptionsMenu(menu);}private Intent getDefaultIntent() {Intent intent = new Intent(Intent.ACTION_SEND);intent.setType("image/*");return intent;}
}
//自定义一个Action Provider,比如说如果想要建立一个拥有两项子菜单的Action Provider//新建了一个MyActionProvider继承自ActionProvider,为了表示这个Action Provider是有子菜单的,需要重写hasSubMenu()方法并返回true,
//然后在onPrepareSubMenu通过调用SubMenu的add()方法添加子菜单
public class MyActionProvider extends ActionProvider {public MyActionProvider(Context context) {super(context);}@Overridepublic View onCreateActionView() {return null;}@Overridepublic void onPrepareSubMenu(SubMenu subMenu) {subMenu.clear();subMenu.add("sub item 1").setIcon(R.drawable.ic_launcher).setOnMenuItemClickListener(new OnMenuItemClickListener() {@Overridepublic boolean onMenuItemClick(MenuItem item) {return true;}});subMenu.add("sub item 2").setIcon(R.drawable.ic_launcher).setOnMenuItemClickListener(new OnMenuItemClickListener() {@Overridepublic boolean onMenuItemClick(MenuItem item) {return false;}});}@Overridepublic boolean hasSubMenu() {return true;}}
public class TabListener<T extends Fragment> implementsandroid.app.ActionBar.TabListener {/*  使用ActionBar提供的Tab功能,大致可以分为以下几步1. 实现ActionBar.TabListener接口,这个接口提供了Tab事件的各种回调,比如当用户点击了一个Tab时,你就可以进行切换Tab的操作。2.为每一个你想添加的Tab创建一个ActionBar.Tab的实例,并且调用setTabListener()方法来设置ActionBar.TabListener。除此之外,还需要调用setText()方法来给当前Tab设置标题。3.最后调用ActionBar的addTab()方法将创建好的Tab添加到ActionBar中。*/private Fragment mFragment;private final Activity mActivity;private final String mTag;private final Class<T> mClass;public TabListener(Activity activity, String tag, Class<T> clz) {mActivity = activity;mTag = tag;mClass = clz;}// 当Tab被选中的时候会调用onTabSelected()方法,// 在这里我们先判断mFragment是否为空,// 如果为空的话就创建Fragment的实例并调用FragmentTransaction的add()方法,// 如果不会空的话就调用FragmentTransaction的attach()方法。// 而当Tab没有被选中的时候,则调用FragmentTransaction的detach()方法,将UI资源释放掉。// 当Tab被重新选中的时候会调用onTabReselected()方法,如果没有特殊需求的话,通常是不需要进行处理的。public void onTabSelected(Tab tab, FragmentTransaction ft) {if (mFragment == null) {mFragment = Fragment.instantiate(mActivity, mClass.getName());ft.add(android.R.id.content, mFragment, mTag);} else {ft.attach(mFragment);}}public void onTabUnselected(Tab tab, FragmentTransaction ft) {if (mFragment != null) {ft.detach(mFragment);}}public void onTabReselected(Tab tab, FragmentTransaction ft) {}}

Android笔记 actionbar学习相关推荐

  1. 2013-2-19 Android之ActionBar学习(转)

    2013-2-19 Android之ActionBar学习(转) Android之ActionBar学习 - Android移动开发技术文章_手机开发 - 红黑联盟 资讯 |  安全 |  论坛 |  ...

  2. Android之内核学习笔记

    0.Android系统启动 <Android系统启动流程 -- bootloader> <The Android boot process from power on> < ...

  3. Android编译及编译脚本、Android构建基础学习笔记

    Android编译及编译脚本.Android构建基础学习笔记 Android编译及编译脚本 概述 Android.mk转换成Android.bp 例子(简单Android.mk文件转Android.b ...

  4. Android开发技术学习笔记

    目标:全面学习知识点,能理解原理,多实战练习并做笔记与总结学习心得 Android开发技术学习笔记记录如下: Android开发Google的官网https://developer.android.g ...

  5. 2022最新Android开发全套学习资料(知识笔记+技能图谱)3-5年开发者进阶提升

    前言 本人2013年由 java 转到 Android 开发,十年间,我从小厂打杂到进入到核心团队,再跳槽到大厂,在华为呆过一段时间,18年四月份进了阿里一直到现在.这期间,我见证过很多人的成败起落, ...

  6. Android基础知识点学习总结

    Android基础知识点学习总结 安卓基础知识个人学习笔记分享~ 一.Android系统架构 Linux内核层→系统运行层→应用框架层→应用层 1.Linux内核层:Android系统是基于Linux ...

  7. 2021年超详细的-Android超神学习路线总结--纯干货分享(字节,阿里,腾讯大牛联合打造)

    前言 2021年秋招没有找到满意工作的童鞋,考研结果不理想的童鞋,留学生回国的童鞋们,都开始准备2021年的春招了,如果想从事Android开发工作,可以参考本文. 本文整理了Android开发的学习 ...

  8. Android笔记树

    更新至笔记72 2018-05-07 目录 入门基础 1.1 四大组建 四大组件之Activity 四大组件之Service 四大组件之BroadcastReceive 四大组件之ContentPro ...

  9. android listview替代,Android笔记——RecyclerView替代ListView

    ListView是常用列表控件,但设置Adapter时自定义代码较为复杂,因此Android3.0后,增加RecyclerView替代ListView RecyclerView没有提供OnItemCl ...

最新文章

  1. python爬取百度贴吧中的所有邮箱_使用 Python 编写多线程爬虫抓取百度贴吧邮箱与手机号...
  2. netty服务器定时发送消息,netty+websocket+quartz实现消息定时推送
  3. Tornado--基于H5图片的上传
  4. 如何设置电脑自动锁屏_工信部重要提醒:赶紧设置这个密码!手机丢时也不怕损失!...
  5. stc单片机入门c语言,谈谈单片机入门
  6. [51CTO]给您介绍Windows10各大版本之间区别
  7. Linux block
  8. android应用开发全程实录-你有多熟悉listview? .
  9. Struts2-01-数据访问
  10. 用递归来实现汉诺塔的问题
  11. 计算机电子电路原理图,电路图讲解 电路图基础知识【图】
  12. c语言 获取硬盘序列号,获取硬盘序列号的C++代码
  13. linux bridge - mac和vlan转发
  14. 最新Centos7.6 部署ELK日志分析系统
  15. android 类似qq空间微博微信九宫格图片
  16. 对比Excel两个sheet的数据是否相同
  17. iveiw:Switch开关用法
  18. Web全栈~28.网络编程
  19. C语言运算符的优先级和结合性
  20. 英语练习91 Society is changing rapidly.

热门文章

  1. 阿里Java研发工程师实习面经
  2. Vue.JS学习笔记
  3. SqlMap异常的处理
  4. 【转】解决XMLHTTP获取网页中文乱码问题
  5. 小议size_t和size_type
  6. Silverlight 2 搜索照片
  7. 掌握jsp自定义标签:(四)
  8. select语句 rows相等_我去,这两个小技巧,让我的SQL语句不仅躲了坑,还提升了 1000 倍(半分钟干货系列)...
  9. php nb2br,PHP中基本符号及使用方法
  10. C语言-按照单词反转字符串(完整代码)