您的位置:首页 > 其它

ActionBar

2016-02-21 22:28 204 查看
定义:

android3.0之后引入的,是一个导航控件,用以代替传统屏幕顶端的标题栏。要兼容低版本使用support library v7中ActionBar就可以了
ActionBar显示在屏幕顶部的控件,它包括了在左边显示的应用的logo图标和右边操作菜单的可见项
存在的目的:
在不同的应用程序之间提供一致的导航和视觉体验
突出Activity的关键操作(如“搜索”、“创建”、“共享”等),并且在可预见的方法内给用户提供快捷的访问
注:android5.0之后抛弃了ActionBar,用toolBar代替了


2.ActionBar的主题Theme:

在清单文件中activity的theme属性设置:
android:theme="@android:style/Theme.Dialog"     让当前Activity启动时以对话框的形式启动
android:theme="@android:style/Theme.Light.NoTitleBar"    没有标题栏的白色主题
android:theme="@android:style/Theme.NoTitleBar"     没有标题栏的黑色主题
android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen"    以全屏显示,没有标题栏,也没有状态栏
android:theme="@android:style/Theme.Translucent"    让当前Activity以透明背景的形式显示,但透明背景下上面的控件依然可用
ndroid:theme="@android:style/Theme.Holo"    导航栏和主页面都全黑


3.ActionBar的使用:

A:声明ActionBar对象,并通过getActionBar()得到Actionbar对象
在系统包中,通过getActionBar()得到
在V7包下,通过getSupportActionBar()得到
private ActionBar actionBar;
actionBar = getActionBar();

B: 通过ActionBar对象进行操作
常见用法:
actionBar.show();显示ActionBar,将上方整个ActionBar显示
actionBar.hide();隐藏ActionBar,将上方整个ActionBar隐藏
actionBar.setDisplayHomeAsUpEnabled(true);在ActionBar上显示返回图标
备注:在引用主题的地方自定义返回按钮的图:<item name=“android:homeAsUpindicator”>@drawable/?</item>
actionBar.isShowing();返回boolean类型,判断Actionbar的显示状态true-->ActionBar显示,false-->ActionBar隐藏

Demo:ActionBar的显示与隐藏
// 判断当前actionBar的显示状态
boolean isShowing = this.actionBar.isShowing();// true--》显示,false隐藏
if (isShowing) {
// 隐藏
this.actionBar.hide();
} else {
// 显示
this.actionBar.show();

4.自定义的ActionBar
//给ActionBar添加自己的布局
//1写出需要添加的布局
//2调用setCoustemView()将布局添加
//3让ActionBar显示自定义的布局
View view = LayoutInflater.from(this).inflate(R.layout.activity_actionbar, null);
actionBar.setCustomView(view);
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);

4.Menu下item属性


id:表示动作项的id,与menu项一致
title:动作项文本
showAsAction的属性:
never:不显示在ActionBar中,只在溢出列表中显示,而且只显示标题,所以在定义item时,最好带上标题,对于有menu按键的手机设备,可以点击menu按键进行查看,
备注:溢出菜单
ifRoom:会显示在item当中,但是如果已经有4个或者4个以上的item时会隐藏在溢出列表中。当然个数不仅局限于4哥,
依据屏幕的宽和窄而定。对于有menu按键的手机设备,可以点击menu按键进行查看
always:一直显示在ActionBar上(即:三个点上)
withText:显示图标的同时还要显示title文本,如果空间不足就不会显示title,只有当用户长按动作项时会弹出title的Toast,起到提示作用
collapseActionView:折叠效果(一般配合ifRoom一起使用才有效果


5.SearchView的使用:

A:在menu下的XML中创建item,注意属性android:actionViewClass="SearchView的包名+类名"
<item
android:id="@+id/action_search"
android:orderInCategory="100"
android:showAsAction="always"
android:actionViewClass="android.widget.SearchView"
android:title="搜索"/>
B:在onCreateOptionsMenu(Menu menu)方法中通过菜单填充器得到菜单
getMenuInflater().inflate(R.menu.main, menu);
C:根据id得到搜索菜单项
MenuItem item_search = menu.findItem(R.id.action_search);
D:通过getActionView()得到searchview对象
方式一:SearchView searchView = (SearchView) MenuItemCompat.getActionView(item_search);
方式二:SearchView searchView = (SearchView) item_search.getActionView();
注意:有的时候为了避免空指针必须用第一种方式。
E:设置监听:
searchView.setOnQueryTextListener(new OnQueryTextListener() {
//当用户按确认键或者回车键的时候调用
public boolean onQueryTextSubmit(String query) {}
//当输入文本发生变化的时候调用
public boolean onQueryTextChange(String newText) {}
});


5.ActionBar的分类以及使用

5.1 带有返回箭头的ActionBar

使用步骤:
A:声明ActionBar,并通过getActionBar()/getActionSupportBar()得到ActionBar对象
private ActionBar actionBar;
this.actionBar = this.getActionBar();
B: 通过设置属性将箭头显示,
actionBar.setDisplayHomeAsUpEnabled(true);
C:给箭头加监听;
ActionBar显示在菜单中,onOptionsItemSelected(MenuItem item) 方法为菜单的监听事件。
注意:ActionBar返回箭头对应的id为 abdroid.R.id.home;
int id = item.getItemId();
switch (id) {
// ActionBar的返回图标对应的id
case android.R.id.home:
this.finish();//结束当前的Activity
break;

default:
break;
}

这样当跳转到其他Activity的时候,点击返回箭头就能返回到上一个Activity
D:当在另一个Activity中记得设置ActionBar 的箭头显示
ActionBar actionBar = this.getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);


5.2 显示隐藏的Actionbar android:actionLayout=”“:

isActionViewExpanded();判断是否折叠的状态

collapseActionView();折叠

expandActionView();展开

A: item的布局:注意showAsAction的属性
<item
android:id="@+id/action_layout"
android:orderInCategory="100"
android:showAsAction="ifRoom|collapseActionView"
android:actionLayout="@layout/customer_item" //customer_item为layout下的布局
android:title="ActionLayout"/>
B:声明ActionBar,并通过getActionBar()/getActionSupportBar()得到ActionBar对象
private ActionBar actionBar;
this.actionBar = this.getActionBar();
C:菜单选项在onCreateOptionsMenu(Menu menu)中,通过布局填充器得到菜单项,并通过menu得到每条item,
通过getActionView()得到自定义的布局对象。

getMenuInflater().inflate(R.menu.main, menu);
menuItem = menu.findItem(R.id.action_layout);
View view = menuItem.getActionView();//可对布局对象进行操作
D:通过MenuItemCompat.setOnActionExpandListener()设置监听  ,将每条item传入。
MenuItemCompat.setOnActionExpandListener(menuItem,
new OnActionExpandListener() {
/**
* 当ActionLayout展开的时候自动调用的方法
*/
@Override
public boolean onMenuItemActionExpand(MenuItem arg0) {
// 必须返回true,否则无法展开布局对象
return true;
}
/**
* 当ActionLayout折叠的时候自动调用的方法
*/
@Override
public boolean onMenuItemActionCollapse(MenuItem arg0) {
// 必须返回true,否则无法折叠布局对象
return true;
}
});


5.3 分享的Actionbar android:actionProviderClass=”“

A:在menu下设置item,
<item
android:id="@+id/action_provider"
android:orderInCategory="100"
android:showAsAction="always"
android:actionProviderClass="android.widget.ShareActionProvider"
android:title="分享"/>

B:菜单的点击事件在onCreateOptionsMenu(Menu menu) {} 中   ,通过布局填充器得到菜单项,并通过menu得到每条item,
//得到菜单项
getMenuInflater().inflate(R.menu.main, menu);
//得到每条item
MenuItem menuItem_pro = menu.findItem(R.id.action_provider);
C:通过调用工具类的方法(getActionProvider())得到SharedActionProvider
ShareActionProvider sap = (ShareActionProvider) menuItem_pro.getActionProvider();

D:通过Intent设置分享关联的意图对象。
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT, "歌唱祖国");
intent.setType("text/plain");
shareActionProvider.setShareIntent(intent);


5.4 ActionBar的选项卡模式

ActionBar的导航模式:通过actionBar.setNavigationMode()设置
ActionBar.NAVIGATION_MODE_STANDARD ; 标准模式,默认值,使用菜单文件生成的菜单
Actionbar.NAVIGATION_MODE_TABS ; 选项卡模式,需要手工添加选项卡
Actionbar.NAVIGATION_MODE_LIST ; 列表模式
使用步骤:
A:声明ActionBar,并通过getActionBar()/getActionSupportBar()得到ActionBar对象
private ActionBar actionBar;
this.actionBar = this.getActionBar();
B:设置ActionBar的导航模式为选项卡模式:
this.actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
C:使用actionBar.newTab()方法得到选项卡对象,并设置
ActionBar.Tab tab_file = this.actionBar.newTab();
tab_file.setText("文件");//设置选项卡标题
tab_file.setIcon(R.drawable.ic_launcher);//设置图片
D:将生成的选项卡对象添加到ActionBar上面
this.actionBar.addTab(tab_file,true);//后面设置为true则是进入后默认显示,不写则不是
E:设置监听.setTabListener()实现TabListener接口;重写三个方法
(在这里因为有很多选项卡所以使用内部类实现ActionBar.TabListener接口方式比较简便)
this.actionBar.setTabListener(myTabListener);
代码:
private final class MyTabListener implements ActionBar.TabListener{
/**
* 当选项卡处于选中状态调用的方法
* tab:选项卡对象
*      方法:tab.getText()-->得到选项卡的内容
*            tab.getPosition()-->得到选项卡的位置
* ft : 碎片事务对象,需要注意:这个事务对象不需要手工提交,即不用ft.commit()
*/
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {

}
/**
* 当选项卡失去选中状态调用的方法
* tab:选项卡对象
* ft : 碎片事务对象,需要注意:这个事务对象不需要手工提交,即不用ft.commit()
*/
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {

}
/**
* 当选项卡处于选中状态,用户继续点击这个选项卡的时候调用的方法
* tab:选项卡对象
* ft : 碎片事务对象,需要注意:这个事务对象不需要手工提交,即不用ft.commit()
*/
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {

}
}


Demo:ActionBar Tab 与fragment一起使用

在监听的onTabSelected方法中:
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
MyFragment fragment = new MyFragment();
Bundle bundle = new Bundle();
//得到当前选项卡的内容


// bundle.putString(“info”, tab.getText().toString());

//得到当前选项卡的索引位,从0开始

bundle.putInt(“position”, tab.getPosition());

fragment.setArguments(bundle);
ft.replace(R.id.linear, fragment);
}
在Fragment的onCreateView()方法中:
View view = inflater.inflate(R.layout.activity_fragment, null);
text = (TextView) view.findViewById(R.id.textView1);
// 得到当前选项卡的索引位、
int positing = bundle.getInt("position");
switch (positing) {
case 0:
text.setText("傻");
break;
case 1:
text.setText("白");
break;
case 2:
text.setText("甜");
break;

default:
break;
}
return view;


5.5 ActionBar的列表模式

使用步骤:
A:声明ActionBar,并通过getActionBar()/getActionSupportBar()得到ActionBar对象
private ActionBar actionBar;
this.actionBar = this.getActionBar();
B: 设置导航模式为列表模式:
this.actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
C:通过.setListNavigationCallbacks()方法设置监听
this.actionBar.setListNavigationCallbacks(adapter, callback);
1)分析发现该监听需要一个SpinnerAdapter adapter,和OnNavigationListener callback
所以列表的item的数据源通过adapter传入。
2)定义适配器,BaseAdapter实现了SpinnerAdapter,ArrayAdapter和SimpleAdapter又是BaseAdapter,所以有多中adapter可选择
填充数据。将适配器传入监听方法中。

设置监听实现方法:

this.actionBar.setListNavigationCallbacks(adapter, new OnNavigationListener() {

/**
* 当actionBar上的导航条目被选中时自动调用的方法
* itemPosition:当前列表对应的索引位
* itemId:条目id
* return:当前事件是否被处理掉了
*/
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {

return false;
}
});


Demo:与fragment一起使用:

MainActivity中:
public class MainActivity extends Activity {

private ActionBar actionBar;
private ArrayAdapter<String> adapter;
String[] data = { "文件", "编辑", "查看" };
private FragmentManager fragmentManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
actionBar = getActionBar();
fragmentManager = this.getFragmentManager();

// 设置导航模式为列表模式
this.actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
this.adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_expandable_list_item_1, data);

this.actionBar.setListNavigationCallbacks(adapter, new OnNavigationListener() {

/**
* 当actionBar上的导航条目被选中时自动调用的方法
* itemPosition:当前列表对应的索引位
* itemId:条目id
* return:当前事件是否被处理掉了
*/
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

ContentFragment c = new ContentFragment();
Bundle bundle = new Bundle();
bundle.putString("info", data[itemPosition]);
bundle.putInt("position", itemPosition);
c.setArguments(bundle);
fragmentTransaction.replace(R.id.linear_main, c);
fragmentTransaction.commit();
return false;
}
});
}

Fragment中:
public class ContentFragment extends Fragment {
private TextView text;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_fragment, null);
text = (TextView) view.findViewById(R.id.textView1);

Bundle bundle = this.getArguments();
String info = bundle.getString("info");
int position = bundle.getInt("position");
// text.setText(info);
switch (position) {
case 0:
text.setText("哪有文件");
break;
case 1:
text.setText("编辑什么");
break;
case 2:
text.setText("看什么看");
break;

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