- App Icon:可显示APP的icon,也可用其他图标代替。当软件不在最高级页面时,图标左侧会显示一个左箭头,用户可以通过这个箭头向上导航。
- 视图切换:(效果如下图)
- Action Buttons:这个放最重要的软件功能,放不下的按钮就自动进入Action overflow了。
- Action overflow:不常用的操作项目自动进入Action overflow
(二)、创建ActionBar:
1、XML资源文件中定义menu。同样可以有普通菜单、二级普通菜单、二级可选项菜单。
<item
android:id="@+id/menu_about"
android:orderInCategory="2"
android:showAsAction="never" 【注意:android:showAsAction的属性值有:never、always、ifRoom、withText、collapseActionView】
android:title="关于"/>
android:showAsAction属性值的解释:
- never : 不将该MenuItem显示在ActionBar上(是默认值)
- always : 总是将该MenuItem显示在ActionBar上
- ifRoom : 当AcitonBar位置充裕时将该MenuItem显示在ActionBar上
- withText : 将该MenuItem显示在ActionBar上,并显示该菜单项的文本
- collapseActionView : 将该ActionView折叠成普通菜单项。最低API=14
多个属性可以同时使用,使用“|”分隔。
(三)、启动程序图标导航:(就是让APP的LOGO也变成可以点击的导航图标。)
ActionBar actionBar = this.getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
Intent intent = new Intent(this, MainActivity.class);
//将Activity栈中处于MainActivity主页面之上的Activity都弹出。
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
break;
case R.id.action_search:
break;
default:
return super.onOptionsItemSelected(item);
}
return true;
}
代码解释:
- actionBar = getActionBar(); 获取ActionBar对象。
- actionBar.setDisplayHomeAsUpEnabled(true); 设置是否将LOGO图标转成可点击的按钮,并在图标前添加一个向左的箭头。
- actionBar.setHomeButtonEnabled(true); 设置是否将LOGO图标转变成可点击的按钮。
- actionBar.setDisplayShowHomeEnabled(true); 设置是否显示LOGO图标。
<item
android:id="@+id/action_search"
android:orderInCategory="1"
android:showAsAction="always"
android:title="搜索"
android:icon="@drawable/ic_launcher"
android:actionViewClass="android.widget.SearchView" //两种写法任选其一android:actionLayout="@layout/search” /> <item android:id="@+id/action_clock" android:orderInCategory="2" android:showAsAction="always" android:title="时钟" android:icon="@drawable/ic_launcher" android:actionLayout="@layout/clock" />
【备注:】以上两个布局文件代码如下:
一、显示搜索的布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<SearchView
android:id="@+id/search_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</SearchView>
</LinearLayout>
二、显示时钟的布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<AnalogClock
android:id="@+id/analogClock_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
@Override
publicboolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
//根据item的id通过finditem方法得到menuitem对象
MenuItem menuItem=menu.findItem(R.id.action_search);
//根据menuitem对象得到SearchView对象
//SearchView searchView=(SearchView) MenuItemCompat.getActionView(menuItem); v4
SearchView searchView=(SearchView) menuItem.getActionView();//api11
searchView.setInputType(EditorInfo.TYPE_CLASS_TEXT);//指定SearchView获取焦点时弹出的软键盘的类型
searchView.setImeOptions(EditorInfo.IME_ACTION_SEARCH);//指定弹出软键盘enter键的功能
/*
* 当SearchView查询具体的内容时调用的监听
* 查询文本内容改变时回调
*/
searchView.setOnQueryTextListener(new OnQueryTextListener() {
/*
* 当查询的条件提交时回调的方法
*/
@Override
publicboolean onQueryTextSubmit(String query) {
System.out.println("-------提交的查询条件--------"+query);
returntrue;
}
/*当SearchView中的查询的文本改变时回调的方法
* 参数表示 变化的文本字符串
*/
@Override
publicboolean onQueryTextChange(String newText) {
System.out.println("-------查询条件改变的字符串--------"+newText);
returntrue;
}
});
returntrue;
}
@Overridepublicboolean onCreateOptionsMenu(Menu menu) {
mMenu=menu;
getMenuInflater().inflate(R.menu.other, menu);
//根据id得到当前自定义布局的menuitem对象
MenuItem menuItem=menu.findItem(R.id.action_cus);
View view=menuItem.getActionView();//得到当前item中的自定义布局view对象
Button button=(Button) view.findViewById(R.id.button1);//根据id得到自定义view中的控件
final EditText editText=(EditText) view.findViewById(R.id.editText1);
button.setOnClickListener(new OnClickListener() {
@Override
publicvoid onClick(View v) {
String edString=editText.getText().toString().trim();
Toast.makeText(OtherActivity.this, edString,Toast.LENGTH_SHORT).show();
}
});
//表示当acticview展开以及收缩时触发的监听事件
menu.findItem(R.id.action_cus).setOnActionExpandListener(new OnActionExpandListener() {
@Override
publicboolean onMenuItemActionExpand(MenuItem item) {
System.out.println("-------------onMenuItemActionExpand");
returntrue;
}
@Override
publicboolean onMenuItemActionCollapse(MenuItem item) {
System.out.println("-------------onMenuItemActionCollapse");
returntrue;
}
});
returnsuper.onCreateOptionsMenu(menu);
}
<activity
android:name="com.steven.android23.tab5_fragmentactionbartwo.MainActivity"
android:label="@string/app_name"
android:uiOptions="splitActionBarWhenNarrow">
<item
android:id="@+id/action_shared"
android:orderInCategory="100"
android:showAsAction="ifRoom"
android:actionProviderClass="android.widget.ShareActionProvider"
android:title="@string/action_settings"/>
<!--
android:actionProviderClass="android.widget.ShareActionProvider" 表示指定actionbar中的提供操作为分享
—>
@Override
publicboolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
//根据menuitem的指定的id获取menuitem的对象
MenuItem menuItem=menu.findItem(R.id.action_shared);
//获得当前ShareActionProvider的对象
ShareActionProvider shareActionProvider=(ShareActionProvider) menuItem.getActionProvider();
Intent shareIntent=new Intent();
shareIntent.setAction(Intent.ACTION_SEND);//指定动作
shareIntent.setType("image/*");// mimetype text/* image/*
shareIntent.putExtra(Intent.EXTRA_TEXT, "分享的数据");
shareActionProvider.setShareIntent(shareIntent);//表示以指定的intent对象启动当前点击的provider中的item
returntrue;
}
<item
android:id="@+id/action_click"
android:orderInCategory="100"
android:showAsAction="always"
android:actionProviderClass="com.qianfeng.actionprovider.MyProvider"
android:title="@string/action_settings"/>
<!--
如果actioprovider中使用的时自定义的内容
android:actionProviderClass="自定义actionprovider的包名.类名"
—>
publicclass MyProvider extends ActionProvider {
private Context context;
private LayoutInflater layoutInflater;
private View view;
public MyProvider(Context context) {
super(context);
this.context=context;
layoutInflater=LayoutInflater.from(context);
view=layoutInflater.inflate(R.layout.activity_provider, null);
}
/**
* 表示当actionprovider中的view被创建时回调的方法
*/
@Override
public View onCreateActionView() {po
//根据id获取自定义布局中的imageview对象
Button imageView=(Button) view.findViewById(R.id.button);
//当用户点击actionprovider中自定义布局的iamgeview时弹出菜单
imageView.setOnClickListener(new OnClickListener() {
@Override
publicvoid onClick(View v) {
PopupMenu popupMenu=new PopupMenu(context, v);
popupMenu.inflate(R.menu.provider);
popupMenu.show();
}
});
returnview;
}
}
/**
* tab导航得步骤:
* 1.获得actionbar对象 通过setNavigationMode方法将导航模式设置为为tabs导航
* 2.调用actionbar得addtab(Tab tab)方法添加需要导航使用得tab
* 3.为每个tab通过setTabListener 添加tab状态改变得监听
*
*/
publicclass MainActivity extends Activity implements TabListener{
private ActionBar actionBar;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
actionBar=getActionBar();//获得actionbar对象
//指定actionbar得导航模式 tab页导航
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
Tab tab1=actionBar.newTab();//获取当前选项卡对象
//设置tab得标题 tag标签 以及setTabListener 监听事件 必须设置
tab1.setText("头条").setTag("头条").setTabListener(this);
actionBar.addTab(tab1);
actionBar.addTab(actionBar.newTab().setText("娱乐").setTag("娱乐").setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("军事").setTag("军事").setTabListener(this));
}
//------当选项卡得中tab状态改变时回调得方法
/*表示当tab被被选中时候回调得方法
* 第一个参数表示 当前被选中得tab对象
* 第二个参数表示 FragmentTransaction对象
*/
@Override
publicvoid onTabSelected(Tab tab, FragmentTransaction ft) {
Fragment fragment=null;
switch (tab.getPosition()) {//获取当前选择得tab得下标
case 0://头条
fragment=new Fragment1();//创建头条得fragment界面
break;
case 1:
fragment=new Fragment2();
break;
case 2:
fragment=new Fragment3();
break;
}
getFragmentManager().beginTransaction().replace(R.id.layoutContent, fragment).commit();
}
/*表示当tab离开选中状态时候回调得方法
* 第一个参数表示 当前离开得tab对象
* 第二个参数表示 FragmentTransaction对象
*/
@Override
publicvoid onTabUnselected(Tab tab, FragmentTransaction ft) {
}
/*表示当tab再次被选中时候回调得方法
* 第一个参数表示 再次选中得tab对象
* 第二个参数表示 FragmentTransaction对象
*/
@Override
publicvoid onTabReselected(Tab tab, FragmentTransaction ft) {
}
}
/**
* actionbar得下拉导航得步骤:
* 1.获取actionbar对象 通过setNavigationMode设置导航得模式
* 2.调用actionba得setListNavigationCallbacks方法 传入需要得adapter适配器对象提供下拉数据
* 重写NavigationListener下拉item被选中时得回调接口方法
*/
publicclass MainActivity extends Activity {
private ActionBar actionBar;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
actionBar=getActionBar();
//设置导航得模式为下拉模式
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
//根据指定得数据源创建adapter适配器对象
SpinnerAdapter spinnerAdapter=ArrayAdapter.createFromResource(MainActivity.this, R.array.news,
android.R.layout.simple_list_item_1);
/*
* 设置下拉导航得回调方法
* 第一个参数表示 当前填充下拉导航列表得适配器
* 第二个参数表示 当点击下拉导航中得item时触发得回调接口监听
*/
actionBar.setListNavigationCallbacks(spinnerAdapter, new OnNavigationListener() {
/* 当下拉导航中得某个item被点击时回调得方法
* 第一个参数表示 当前选中某一个item得下标
* 第二个参数表示 当前选中某一个item得id
*/
@Override
publicboolean onNavigationItemSelected(int itemPosition, long itemId) {
Fragment fragment=null;
switch (itemPosition) {
case 0:
fragment=new Fragment1();
break;
case 1:
fragment=new Fragment2();
break;
case 2:
fragment=new Fragment3();
break;
}
getFragmentManager().beginTransaction().replace(R.id.layoutContent, fragment).commit();
returnfalse;
}
});
}
}
@Override
protectedvoid onSaveInstanceState(Bundle outState) {
Log.i(TAG, "==index:" + getActionBar().getSelectedNavigationIndex());
outState.putInt("tabindex", getActionBar().getSelectedNavigationIndex());
}
@Override
protectedvoid onRestoreInstanceState(Bundle savedInstanceState) {
getActionBar().setSelectedNavigationItem(
savedInstanceState.getInt("tabindex"));
}