ActionBar

来源:互联网 发布:范思哲男装高仿淘宝 编辑:程序博客网 时间:2024/06/13 08:10
  1. 定义:
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的包名+类名"<itemandroid: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;            }
0 0
原创粉丝点击