您的位置:首页 > 移动开发 > Android开发

android ActionBar详解

2014-02-26 19:59 281 查看

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里面添加一个属性
<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;
}

看代码就知道是干什么了的,然后就是展开和收起操作
item.expandActionView();//展开
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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息