Android应用开发中Action bar编写的入门教程


Posted in Python onFebruary 26, 2016

从Android 3.0开始除了我们重点讲解的Fragment外,Action Bar也是一个重要的内容,Action Bar主要是用于代替传统的标题栏,对于Android平板设备来说屏幕更大它的标题使用Action Bar来设计可以展示更多丰富的内容,方便操控。

Action Bar主要功能包含:

1. 显示选项菜单
2. 提供标签页的切换方式的导航功能,可以切换多个fragment.
3. 提供下拉的导航条目.
4. 提供交互式活动视图代替选项条目
5. 使用程序的图标作为返回Home主屏或向上的导航操作。

提示在你的程序中应用ActionBar需要注意几点,SDK和最终运行的固件必须是Android 3.0即honeycomb,在androidmanifest.xml文件中的uses-sdk元素中加入android:minSdkVersion 或android:targetSdkVersion,类似

< manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="eoe.android.cwj" 
android:versionCode="1" 
android:versionName="1.0"> 
< uses-sdk android:minSdkVersion="honeycomb" /> 
< application ... > 
 
< /application> 
< /manifest>

  如果需要隐藏Action Bar可以在你的Activity的属性中设置主题风格为NoTitleBar在你的manifest文件中,下面的代码在3.0以前是隐藏标题,而在3.0以后就是隐藏ActionBar了,代码为:

< activity android:theme="@android:style/Theme.NoTitleBar">

一、添加活动条目 Action Items

对于活动条目大家可以在下图看到Android 3.0的标题右部分可以变成工具栏,下面的Save和Delete就是两个Action Items活动条目。

下面是一个menu的layout布局文件代码

< ?xml version="1.0" encoding="utf-8"?> 
< menu xmlns:android="http://schemas.android.com/apk/res/android"> 
< item android:id="@+id/menu_add" 
android:icon="@drawable/ic_menu_save" 
android:title="@string/menu_save" 
android:showAsAction="ifRoom|withText" /> 
< /menu>

  而其他代码类似Activity中的Menu,比如

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
switch (item.getItemId()) { 
case android.R.id.home: 
// 当Action Bar的图标被单击时执行下面的Intent 
Intent intent = new Intent(this, Android123.class); 
startActivity(intent); 
break; 
} 
return super.onOptionsItemSelected(item); 
}

对于ActionBar的创建,可以在你的Activity中重写onStart方法:

@Override 
protected void onStart() { 
super.onStart(); 
ActionBar actionBar = this.getActionBar(); 
actionBar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_HOME_AS_UP); 
}

 调用getActionBar方式在你的Activity的onCreate中时需要注意必须在调用了setContentView之后。

二、添加活动视图 Action View

对于ActionView,我们可以在menu的布局文件使用中来自定义searchview布局,如下:

< item android:id="@+id/menu_search" 
android:title="Search" 
android:icon="@drawable/ic_menu_search" 
android:showAsAction="ifRoom" 
android:actionLayout="@layout/searchview" />

 也可以直接指定Android系统中的SearchView控件,那么这时menu"_search的代码要这样写:

< item android:id="@+id/menu_search" 
android:title="Search" 
android:icon="@drawable/ic_menu_search" 
android:showAsAction="ifRoom" 
android:actionViewClass="android.widget.SearchView" />

  大家注意上面的两种方法中一个属性是actionLayout制定一个layout xml布局文件,一个是actionViewClass指定一个类,最终调用可以在Activity中响应onCreateOptionsMenu方法映射这个menu布局即可.

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
getMenuInflater().inflate(R.menu.options, menu); 
SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); 
return super.onCreateOptionsMenu(menu); 
}

三、添加标签 Tabs

  在ActionBar中实现标签页可以实现android.app.ActionBar.TabListener ,重写onTabSelected、onTabUnselected和onTabReselected方法来关联Fragment。代码如下:

private class MyTabListener implements ActionBar.TabListener { 
 private TabContentFragment mFragment; 
 public TabListener(TabContentFragment fragment) { 
 mFragment = fragment; 
 } @Override 
 public void onTabSelected(Tab tab, FragmentTransaction ft) { 
 ft.add(R.id.fragment_content, mFragment, null); 
 } 
 @Override 
 public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
 ft.remove(mFragment); 
 } 
 @Override 
 public void onTabReselected(Tab tab, FragmentTransaction ft) { 
 } 
 
}

接下来我们创建ActionBar在Activity中,代码如下;

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 
final ActionBar actionBar = getActionBar(); //提示getActionBar方法一定在setContentView后面 
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
actionBar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); 
Fragment artistsFragment = new ArtistsFragment(); 
actionBar.addTab(actionBar.newTab().setText(R.string.tab_artists).setTabListener(new TabListener(artistsFragment))); 
Fragment albumsFragment = new AlbumsFragment(); 
actionBar.addTab(actionBar.newTab().setText(R.string.tab_albums).setTabListener(new TabListener(albumsFragment))); 
}

四、添加下拉导航 Drop-down Navigation:

创建一个SpinnerAdapter提供下拉选项,和Tab方式不同的是Drop-down只需要修改下setNavigationMode的模式,将ActionBar.NAVIGATION_MODE_TABS改为ActionBar.NAVIGATION_MODE_LIST,最终改进后的代码为

ActionBar actionBar = getActionBar(); 
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
actionBar.setListNavigationCallbacks(mSpinnerAdapter, mNavigationCallback);

上面我们通过setListNavigationCallbacks方法绑定一个SpinnerAdapter控件,具体的OnNavigationListener代码示例为;

mOnNavigationListener = new OnNavigationListener() { 
 String[] strings = getResources().getStringArray(R.array.action_list); 
 @Override 
 public boolean onNavigationItemSelected(int position, long itemId) { 
 ListContentFragment newFragment = new ListContentFragment(); 
 FragmentTransaction ft = openFragmentTransaction(); 
 ft.replace(R.id.fragment_container, newFragment, strings[position]); 
 ft.commit(); 
 return true; 
} 
 
};

而其中的ListContentFragment的代码为:

public class ListContentFragment extends Fragment { 
private String mText; 
 
@Override 
public void onAttach(Activity activity) { 
super.onAttach(activity); 
mText = getTag(); 
} 
 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
Bundle savedInstanceState) { 
TextView text = new TextView(getActivity()); 
text.setText(mText); 
return text; 
} 
}

五、实现切换Tabs标签;
  
Activity代码:  

public class ActionBarTabs extends Activity { 
 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.action_bar_tabs); 
} 
 
public void onAddTab(View v) { 
final ActionBar bar = getActionBar(); 
final int tabCount = bar.getTabCount(); 
final String text = "Tab " + tabCount; 
 
bar.addTab(bar.newTab().setText(text) 
.setTabListener(new TabListener(new TabContentFragment(text)))); 
} 
 
public void onRemoveTab(View v) { 
final ActionBar bar = getActionBar(); 
bar.removeTabAt(bar.getTabCount() - 1); 
} 
 
public void onToggleTabs(View v) { 
final ActionBar bar = getActionBar(); 
 
if (bar.getNavigationMode() == ActionBar.NAVIGATION_MODE_TABS) { 
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 
 
bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE, ActionBar.DISPLAY_SHOW_TITLE); 
} else { 
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); 
} 
} 
 
public void onRemoveAllTabs(View v) { 
getActionBar().removeAllTabs(); 
} 
 
private class TabListener implements ActionBar.TabListener { 
private TabContentFragment mFragment; 
public TabListener(TabContentFragment fragment) { 
 
mFragment = fragment; 
} 
 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 
ft.add(R.id.fragment_content, mFragment, mFragment.getText()); 
} 
 
 
public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
ft.remove(mFragment); 
} 
 
public void onTabReselected(Tab tab, FragmentTransaction ft) { 
Toast.makeText(ActionBarTabs.this, "Reselected!", Toast.LENGTH_SHORT).show(); 
} 
 
} 
 
private class TabContentFragment extends Fragment { 
private String mText; 
public TabContentFragment(String text) { 
mText = text; 
} 
 
public String getText() { 
return mText; 
} 
 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
Bundle savedInstanceState) { 
View fragView = inflater.inflate(R.layout.action_bar_tab_content, container, false); 
TextView text = (TextView) fragView.findViewById(R.id.text); 
text.setText(mText); 
return fragView; 
} 
} 
}

涉及的布局文件action_bar_tabs.xml代码为:

< ?xml version="1.0" encoding="utf-8"?> 
< LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical"> 
 
< FrameLayout android:id="@+id/fragment_content" 
android:layout_width="match_parent" 
android:layout_height="0dip" 
android:layout_weight="1" /> 
 
< LinearLayout android:layout_width="match_parent" 
android:layout_height="0dip" 
android:layout_weight="1" 
android:orientation="vertical"> 
 
< Button android:id="@+id/btn_add_tab" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="@string/btn_add_tab" 
android:onClick="onAddTab" /> 
 
< Button android:id="@+id/btn_remove_tab" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="@string/btn_remove_tab" 
android:onClick="onRemoveTab" /> 
 
< Button android:id="@+id/btn_toggle_tabs" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="@string/btn_toggle_tabs" 
android:onClick="onToggleTabs" /> 
 
< Button android:id="@+id/btn_remove_all_tabs" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="@string/btn_remove_all_tabs" 
android:onClick="onRemoveAllTabs" /> 
< /LinearLayout> 
 
< /LinearLayout>

布局文件action_bar_tab_content.xml;

< ?xml version="1.0" encoding="utf-8"?> 
< TextView xmlns:android="http://schemas.android.com/apk/res/android" 
 
android:id="@+id/text" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" />
Python 相关文章推荐
举例讲解Django中数据模型访问外键值的方法
Jul 21 Python
python3之微信文章爬虫实例讲解
Jul 12 Python
Python-OpenCV基本操作方法详解
Apr 02 Python
python使用folium库绘制地图点击框
Sep 21 Python
在Python中COM口的调用方法
Jul 03 Python
详解Pandas之容易让人混淆的行选择和列选择
Jul 10 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
Aug 22 Python
Python实例方法、类方法、静态方法区别详解
Sep 05 Python
paramiko使用tail实时获取服务器的日志输出详解
Dec 06 Python
如何编写python的daemon程序
Jan 07 Python
Python环境搭建过程从安装到Hello World
Feb 05 Python
pytorch查看网络参数显存占用量等操作
May 12 Python
12步教你理解Python装饰器
Feb 25 #Python
Python实现字典依据value排序
Feb 24 #Python
Python中方法链的使用方法
Feb 23 #Python
python开发之list操作实例分析
Feb 22 #Python
python开发之str.format()用法实例分析
Feb 22 #Python
python文件与目录操作实例详解
Feb 22 #Python
python文件操作相关知识点总结整理
Feb 22 #Python
You might like
php学习 函数 课件
2008/06/15 PHP
PHP实现中文圆形印章特效
2015/06/19 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
php原生数据库分页的代码实例
2019/02/18 PHP
Yii框架自定义数据库操作组件示例
2019/11/11 PHP
Jquery中的CheckBox、RadioButton、DropDownList的取值赋值实现代码
2011/10/12 Javascript
js实现的常用的左侧导航效果
2013/10/17 Javascript
JavaScript中的立即执行函数表达式介绍
2015/03/15 Javascript
跟我学习javascript的浮点数精度
2015/11/16 Javascript
使用jQuery在移动页面上添加按钮和给按钮添加图标
2015/12/04 Javascript
实例详解jQuery的无new构建
2016/08/02 Javascript
JS仿Base.js实现的继承示例
2017/04/07 Javascript
使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能
2017/11/27 Javascript
关于vue中 $emit的用法详解
2018/04/12 Javascript
vue仿element实现分页器效果
2018/09/13 Javascript
监控微信小程序中的慢HTTP请求过程详解
2019/07/05 Javascript
Vue实现多标签选择器
2019/11/28 Javascript
用VsCode编辑TypeScript的实现方法
2020/05/07 Javascript
解决echarts vue数据更新,视图不更新问题(echarts嵌在vue弹框中)
2020/07/20 Javascript
[45:18]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第一场
2018/04/04 DOTA
python根据文件大小打log日志
2014/10/09 Python
Python中使用md5sum检查目录中相同文件代码分享
2015/02/02 Python
python实现图片横向和纵向拼接
2020/03/05 Python
Python生成器实现简单&quot;生产者消费者&quot;模型代码实例
2020/03/27 Python
Python 实现一行输入多个数字(用空格隔开)
2020/04/29 Python
利用OpenCV中对图像数据进行64F和8U转换的方式
2020/06/03 Python
基于Python3读写INI配置文件过程解析
2020/07/23 Python
Python系统公网私网流量监控实现流程
2020/11/23 Python
CSS3实战第一波 让我们尽情的圆角吧
2010/08/27 HTML / CSS
HTML5中的拖放实现详解
2017/08/23 HTML / CSS
宿舍违规用电检讨书
2014/02/16 职场文书
优秀大学生求职自荐信范文
2014/04/19 职场文书
详解Python中__new__方法的作用
2022/03/31 Python
 分享一个Python 遇到数据库超好用的模块
2022/04/06 Python
Python使用华为API为图像设置多个锚点标签
2022/04/12 Python
Python 图片添加美颜效果
2022/04/28 Python