1:ActionBar介绍
ActionBar和Fragement都是android3.0以后出的新特性。ActionBar有点像Windows下面的工具栏,可以放置各种控件。在ADT创建工程的时候里面有两个文件夹values-v11和values-v14这两个文件里面定义就是android3.x和4.x的两种不同ActionBar风格。
2:ActionBar实例介绍
2.1:ActionBar使用简介
当我们创建工程的时候会在menu文件夹下面生成一个main.xml的文件夹,打开这个xml里面的有个属性是我们ActionBar的主要的属性,
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="always"
android:icon="@drawable/ic_launcher"
android:title="@string/action_settings"/>
这里有个showAsAction="always"这个属性就是我们ActionBar的主要属性,它规定了我们的item显示的方式,默认创建的时候它的值是never,这个属性有五个值。
1.ifRoom ----------只有在ActionBar有空间的时候才会显示
2:withText -------------显示文字,一般与ifRoom一起使用。
3: never ---------不显示在ActionBar上面
4:always---------总是放在actionbar上面但是如果实在放不下去还是不会放
5:coolapseActionVIew-----允许与Action按钮关联的Action视图可折叠
下面我们来看一个例子
这里给出我们的xml文件
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="never"
android:icon="@drawable/ic_launcher"
android:title="@string/action_settings"/>
<item
android:id="@+id/action_test_one"
android:orderInCategory="100"
android:showAsAction="ifRoom"
android:icon="@drawable/ic_launcher"
android:title="@string/action_settings"/>
<item
android:id="@+id/action_test_two"
android:orderInCategory="100"
android:showAsAction="always"
android:icon="@drawable/ic_launcher"
android:title="@string/action_settings"/>
</menu>
然后看看我们的java代码
public class MainActivity extends Activity {
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//这一句的意思是隐藏ActionBar()效果跟requestWindowFeature(Window.FEATURE_NO_TITLE);
//差不多
//getActionBar().hide();
}
//这里加载菜单也就是加载ActionBar
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
//处理ActionBar的点击事件
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "actionbar test", Toast.LENGTH_SHORT).show();
return super.onOptionsItemSelected(item);
}
}
如果想要把ActionBar放在底部就需要在Activity里面添加一个属性
这样ActionBar就会在底部了但是这个属性是4.0以后才开始支持的。
<activity
android:name="com.example.actionbardemo.MainActivity"
android:uiOptions="splitActionBarWhenNarrow"
android:label="@string/app_name" />
这样ActionBar就会在底部了但是这个属性是4.0以后才开始支持的。
2:收缩和展开ActionBar
在item标签下面还有两个属性 android:actionViewClass=""android:actionLayout=""
这两个属性就会直接替换控件的视图。随意指定一个但是如果两个都指定了Class这个属性会高于Layout这个属性。
如果需要在展开的时候进行一些操作就需要实现
OnActionExpandListener这个接口里面有两个函数@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
// TODO Auto-generated method stub
return false;
}
public boolean onMenuItemActionCollapse(MenuItem item) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
// TODO Auto-generated method stub
return false;
}
看代码就知道是干什么了的,然后就是展开和收起操作
item.expandActionView();//展开
item.collapseActionView();//收起
item.collapseActionView();//收起
3:ActionProvider
我们要实现的样子就是分享功能
还是先看我们的xml的代码。
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/Share"
android:orderInCategory="100"
android:showAsAction="ifRoom"
android:actionProviderClass="android.widget.ShareActionProvider"
android:title="分享"/>
<item
android:id="@+id/action_test_one"
android:orderInCategory="100"
android:showAsAction="ifRoom"
android:icon="@drawable/ic_launcher"
android:title="@string/action_settings"/>
<item
android:id="@+id/action_test_two"
android:orderInCategory="100"
android:showAsAction="always"
android:icon="@drawable/ic_launcher"
android:title="@string/action_settings"/>
</menu>
然后我们在看看java的实现代码最主要的就是onCreateOptionsMenu其它都一样这里我贴出来。
//这里加载菜单也就是加载ActionBar
@SuppressLint("NewApi")
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
MenuItem item = menu.findItem(R.id.Share);
//获取对象
ShareActionProvider actionProvider = (ShareActionProvider)item.getActionProvider();
Intent intent = new Intent(Intent.ACTION_SEND);
//在分享的时候值显示可以接收文本的程序
intent.setType("text/plain");
//设置要分享的数据
intent.putExtra(Intent.EXTRA_SUBJECT, "分享");
intent.putExtra(Intent.EXTRA_TEXT, "使用ShareActionProvider");
actionProvider.setShareIntent(intent);
//设置一个分享历史避免一个程序中多个分享历史的程序
// actionProvider.setShareHistoryFileName("share.xml");
return true;
}
同时也可以自己定义ActionProvider。有兴趣的可以自己研究一下。
4:导航标签
我们用actionbar替换tabhost,因为actionbar比它更强大,更灵活。一般使用ActionBar的为导航的具体步骤如下。
1:首先设置ActionBar为导航标签模式
getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
2:实现ActionBar.TabLisenler接口
3:创建标签对象
4:添加标签
5:保存和恢复状态
这里看看代码,xml没有改动过,直接上java代码
public class MainActivity extends Activity implements TabListener {
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//这一句的意思是隐藏ActionBar()效果跟requestWindowFeature(Window.FEATURE_NO_TITLE);
//差不多
//getActionBar().hide();
ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.addTab(actionBar.newTab().setText("tab1").setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("tab2").setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("tab3").setTabListener(this));
}
//这里加载菜单也就是加载ActionBar
@SuppressLint("NewApi")
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
MenuItem item = menu.findItem(R.id.Share);
//获取对象
ShareActionProvider actionProvider = (ShareActionProvider)item.getActionProvider();
Intent intent = new Intent(Intent.ACTION_SEND);
//在分享的时候值显示可以接收文本的程序
intent.setType("text/plain");
//设置要分享的数据
intent.putExtra(Intent.EXTRA_SUBJECT, "分享");
intent.putExtra(Intent.EXTRA_TEXT, "使用ShareActionProvider");
actionProvider.setShareIntent(intent);
//设置一个分享历史避免一个程序中多个分享历史的程序
// actionProvider.setShareHistoryFileName("share.xml");
return true;
}
//处理ActionBar的点击事件
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "actionbar test", Toast.LENGTH_SHORT).show();
return super.onOptionsItemSelected(item);
}
/**
* 这个是tab的放开调用的方法
*/
@Override
public void onTabReselected(Tab arg0, FragmentTransaction arg1) {
// TODO Auto-generated method stub
}
/**
* 这个是tab的选中调用的方法
*/
@Override
public void onTabSelected(Tab arg0, FragmentTransaction arg1) {
// TODO Auto-generated method stub
}
/**
* 这个是tab的为选中调用的方法
*/
@Override
public void onTabUnselected(Tab arg0, FragmentTransaction arg1) {
// TODO Auto-generated method stub
}
}
5:下拉导航列表
1:设置ActionBar的导航模式为下拉列表
2:实现ActionBar.OnNavigationListener接口中的方法
3:创建Adapter
4:绑定adapter
5:数据的保存和恢复
我们来看代码,直接上java的xml的一点没变
public class MainActivity extends Activity implements OnNavigationListener {
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//这一句的意思是隐藏ActionBar()效果跟requestWindowFeature(Window.FEATURE_NO_TITLE);
//差不多
//getActionBar().hide();
ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
actionBar.setListNavigationCallbacks(new ArrayAdapter<String>(actionBar.getThemedContext(),
android.R.layout.simple_list_item_1, android.R.id.text1, new String[] { "条目1", "条目2", "条目3" }), this);
}
//这里加载菜单也就是加载ActionBar
@SuppressLint("NewApi")
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
MenuItem item = menu.findItem(R.id.Share);
//获取对象
ShareActionProvider actionProvider = (ShareActionProvider) item.getActionProvider();
Intent intent = new Intent(Intent.ACTION_SEND);
//在分享的时候值显示可以接收文本的程序
intent.setType("text/plain");
//设置要分享的数据
intent.putExtra(Intent.EXTRA_SUBJECT, "分享");
intent.putExtra(Intent.EXTRA_TEXT, "使用ShareActionProvider");
actionProvider.setShareIntent(intent);
//设置一个分享历史避免一个程序中多个分享历史的程序
// actionProvider.setShareHistoryFileName("share.xml");
return true;
}
//处理ActionBar的点击事件
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "actionbar test", Toast.LENGTH_SHORT).show();
return super.onOptionsItemSelected(item);
}
/**
* 点击条目的时候调用的方法
*/
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
// TODO Auto-generated method stub
return false;
}
}