ActionBar
2016-02-21 22:28
204 查看
定义:
2.ActionBar的主题Theme:
3.ActionBar的使用:
5.SearchView的使用:
5.ActionBar的分类以及使用
5.1 带有返回箭头的ActionBar
5.2 显示隐藏的Actionbar android:actionLayout=”“:
isActionViewExpanded();判断是否折叠的状态
collapseActionView();折叠
expandActionView();展开
5.3 分享的Actionbar android:actionProviderClass=”“
5.4 ActionBar的选项卡模式
Demo:ActionBar Tab 与fragment一起使用
// bundle.putString(“info”, tab.getText().toString());
//得到当前选项卡的索引位,从0开始
bundle.putInt(“position”, tab.getPosition());
5.5 ActionBar的列表模式
Demo:与fragment一起使用:
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; }
相关文章推荐
- 用Clion来开发wxwidigets
- C#动态调用Web服务的3种方法
- python pygame安装与使用问题
- tiny4412下的Exynos4412 iROM 启动分析
- Js实现深拷贝和浅拷贝
- andorid 短信
- 使用Clean架构开发Android应用详细指南
- An App ID with Identifier is not available. Please enter a different string
- java 多线程 CountDownLatch用法
- 工厂模式
- java基础之数组常见问题分析
- php生成图片文字水印
- 单例模式
- case...when语句使用
- PHP知识点——2
- PHP知识点——1
- C# 7 新特性-1
- 重新生成和组织索引
- 18-题目1069:查找学生信息
- python基础学习,基础语法总结