ActionBarSherlock的学习笔记

来源:互联网 发布:玩淘宝要费多少流量 编辑:程序博客网 时间:2024/05/21 07:51

                                                        

                                                           一、  ActionBarSherlock的简要介绍


1. 介绍

ActionBarSherlock 是Android compatibility library 的一个扩展, 不知道什么原因 Android 兼容开发包没有包含ActionBar. 所以就有了ActionBarSherlock . 其使用方式和 兼容开发包类似。

ActionBarSherlock 被设计成通过一个API就能够很方便使用所有版本的Android操作栏的设计模式。

 

2.相关网址

其官方网址为:http://actionbarsherlock.com/

github上的地址为:https://github.com/github/android

 

3.ActionBar的介绍

ActionBarSherlock 是ActionBar的扩展,其实是向下兼容的包。所以要学习ActionBarSherlock ,必须要先学习ActionBar。

学习ActionBar最好的地方是官网的资料,地址如下:http://developer.android.com/guide/topics/ui/actionbar.html

 

个人觉得一定要把这篇文字完整的看一遍,是最好的ActionBar的学习资料。

 

我摘点重要的说明:

Figure 1. An action bar that includes the [1] app icon, [2] two action items, and [3] action overflow.

这段说了ActionBar的组成。由 一个应用图标,两个动作的item,和一个溢出的动作  组成。

The action bar provides several key functions:Provides a dedicated space for giving your app an identity and indicating the user's location in the app. Makes important actions prominent and accessible in a predictable way (such as Search). Supports consistent navigation and view switching within apps (with tabs or drop-down lists).

这段说了ActionBar的几个重要的作用:

1.提供一个直接的显示告诉用户他在当前app的位置。

2.给一些重要的操作提供一个直接的方式(例如:搜索)。

3.使整个应用的导航栏的整体风格一致。

 

4.showAsAction的介绍

在使用ActionBar的时候经常要设置showAsAction,这个属性很重要,设置的不准确可能就显示不出来Action  Item.

参考这篇文章的介绍:http://blog.csdn.net/yuxlong2010/article/details/9299507 

 

showAsAction属性共有五个值:ifRoom、never、always、withText、collapseActionView,可以混合使用。

 

ifRoom

会显示在Item中,但是如果已经有4个或者4个以上的Item时会隐藏在溢出列表中。当然个数并不仅仅局限于4个,依据屏幕

的宽窄而定(出现在溢出列表中的时候,可以按menu键弹出,但是只有文字没有相应的icon)

never

永远不会显示。只会在溢出列表中显示,而且只显示标题,所以在定义item的时候,最好把标题都带上。

always无论是否溢出,总会显示。withText

withText值示意Action bar要显示文本标题。Action bar会尽可能的显示这个
标题,但是,如果图标有效并且受到Action bar空间的限制,文本标题有可
能显示不全。

collapseActionView 

声明了这个操作视窗应该被折叠到一个按钮中,当用户选择这个按钮时,这个操作视窗展开。否则,
这个操作视窗在默认的情况下是可见的,并且即便在用于不适用的时候,也要占据操作栏的有效空间。
一般要配合ifRoom一起使用才会有效果。

 


                                                               二、创建ActionBarSherlock


将ActionBarSherlock 作为库项目添加到当前的项目中去,然后创建ActionBar,并自定义ActionBar的标题栏

例子如下:

import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.widget.Toast;import com.actionbarsherlock.app.SherlockActivity;import com.actionbarsherlock.view.MenuItem;public class MainActivity extends SherlockActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initActionBarTitle();    }        /**     * 定义ActionBar的标题栏,可定义标题栏的图标和文字以及是否添加返回按钮     *      * @return void       * @author hsx     * @time 2014-3-14下午07:19:20     */    private void initActionBarTitle() {      // 可以自定义actionbar        getSupportActionBar().setDisplayShowCustomEnabled(true);        getSupportActionBar().setDisplayShowTitleEnabled(false);        // 不在actionbar显示logo        getSupportActionBar().setDisplayShowHomeEnabled(false);        View mainActionBarView = LayoutInflater.from(this).inflate(R.layout.main_action_bar, null);        /**         * 用此方法设置自定义的标题栏          */        getSupportActionBar().setCustomView(mainActionBarView);    }    @Override    public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {        /*         * @param groupId The group identifier that this item should be part of.         * This can be used to define groups of items for batch state changes.         * Normally use {@link #NONE} if an item should not be in a group.         *          * @param itemId Unique item ID. Use {@link #NONE} if you do not need a         * unique ID.         *          * @param order The order for the item. Use {@link #NONE} if you do not         * care about the order. See {@link MenuItem#getOrder()}.         *          * @param title The text to display for the item.         *          *          * menu.add(groupId, itemId, order, title);         */        MenuItem search = menu.add(0, 1, 2, "share");        search.setIcon(R.drawable.abs__ic_menu_share_holo_dark);        search.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);        /*************************************************************           按钮的排列的顺序, 不是按照创建的先后顺序显示的, 而是根据第三个参数(order)的设定显示的,order数字小的排列在前面。         若是order的大小一样则,按照创建的先后顺序显示。         点击事件的判断是根据第二个参数(itemId)做判断的。        /*************************************************************/        MenuItem addItem = menu.add(0, 2, 1, "overflow");        addItem.setIcon(R.drawable.abs__ic_menu_moreoverflow_holo_dark);        addItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);        return super.onCreateOptionsMenu(menu);    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {        switch (item.getItemId()) {        case 1:            Toast.makeText(MainActivity.this, "分享", Toast.LENGTH_SHORT).show();            break;        case 2:            Toast.makeText(MainActivity.this, "溢出栏", Toast.LENGTH_SHORT).show();            break;        }        return super.onOptionsItemSelected(item);    }}

 

                                        三、ActionBarSherlock中的overflow及item的点击事件


定义一个自定义的ActionBar的title,并添加一个overflow的Action   Item。

代码实现 如下  :

import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.widget.Toast;import com.actionbarsherlock.app.SherlockActivity;import com.actionbarsherlock.view.MenuItem;import com.actionbarsherlock.view.SubMenu;public class MainActivity extends SherlockActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initActionBarTitle();    }    private void initActionBarTitle() {        // 可以自定义actionbar        getSupportActionBar().setDisplayShowCustomEnabled(true);        getSupportActionBar().setDisplayShowTitleEnabled(false);        // 不在actionbar显示logo        getSupportActionBar().setDisplayShowHomeEnabled(false);        View mainActionBarView = LayoutInflater.from(this).inflate(R.layout.main_action_bar, null);        getSupportActionBar().setCustomView(mainActionBarView);    }    @Override    public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {        MenuItem search = menu.add(0, 1, 2, "share");        search.setIcon(R.drawable.abs__ic_menu_share_holo_dark);        search.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);        SubMenu addMenu = menu.addSubMenu(0, 2, 3, "overflow");        addMenu.add(0, 3, 0, "更换主题");        addMenu.add(0, 4, 0, "系统设置");        addMenu.add(0, 5, 0, "修改密码");        addMenu.add(0, 6, 0, "更换头像");        MenuItem overFlowItem = addMenu.getItem();        overFlowItem.setIcon(R.drawable.abs__ic_menu_moreoverflow_holo_dark);        overFlowItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);        return super.onCreateOptionsMenu(menu);    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {        switch (item.getItemId()) {        case 1:            Toast.makeText(MainActivity.this, "分享", Toast.LENGTH_SHORT).show();            break;        case 3:            Toast.makeText(MainActivity.this, "更换主题", Toast.LENGTH_SHORT).show();            break;        case 4:            Toast.makeText(MainActivity.this, "系统设置", Toast.LENGTH_SHORT).show();            break;        case 5:            Toast.makeText(MainActivity.this, "修改密码", Toast.LENGTH_SHORT).show();            break;        case 6:            Toast.makeText(MainActivity.this, "更换头像", Toast.LENGTH_SHORT).show();            break;        }        return super.onOptionsItemSelected(item);    }}

效果图 如下 :

 

device-2014-03-14-194618


                                              四、ActionBarSherlock中的搜索及SearchView的使用

1. SearchView 

是搜索的核心组件,具体介绍请参考Android官方说明文档: http://developer.android.com/reference/android/widget/SearchView.html

XML属性

 

属性名称

描述

android:iconifiedByDefault

设置SearchView的默认状态。

如果为true,在没有被使用和点击展开时它将被图形化。

android:maxWidth

SearchView的可选择的最大宽度

android:queryHint

当查询条件为空时显示的一个提示字符串。

 

重要的接口

 

名称作用interface          SearchView.OnCloseListener当用户关闭SearchView时触发的回调函数interface          SearchView.OnQueryTextListener       当查询文本改变时的回调函数。interface          SearchView.OnSuggestionListener在建议上选择事件时的回调接口。

 

demo的核心代码

package com.hsx.wangcuo;import android.app.SearchManager;import android.database.Cursor;import android.database.MatrixCursor;import android.os.Bundle;import android.provider.BaseColumns;import android.view.LayoutInflater;import android.view.View;import com.actionbarsherlock.app.SherlockActivity;import com.actionbarsherlock.view.MenuItem;import com.actionbarsherlock.view.SubMenu;import com.actionbarsherlock.widget.SearchView;import com.hsx.wangcuo.adapter.QuerySuggestionsAdapter;import com.hsx.wangcuo.util.ToastUtil;public class MainActivity extends SherlockActivity implements SearchView.OnSuggestionListener, SearchView.OnQueryTextListener {    private static final String[] COLUMNS = { BaseColumns._ID, SearchManager.SUGGEST_COLUMN_TEXT_1, };    private QuerySuggestionsAdapter mSuggestionsAdapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initActionBarTitle();    }    private void initActionBarTitle() {        // 可以自定义actionbar        getSupportActionBar().setDisplayShowCustomEnabled(true);        getSupportActionBar().setDisplayShowTitleEnabled(false);        // 不在actionbar显示logo        getSupportActionBar().setDisplayShowHomeEnabled(false);        View mainActionBarView = LayoutInflater.from(this).inflate(R.layout.main_action_bar, null);        getSupportActionBar().setCustomView(mainActionBarView);    }    @Override    public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {        createSearchItem(menu);        /*************************************************/        MenuItem share = menu.add(0, 1, 2, "share");        share.setIcon(R.drawable.abs__ic_menu_share_holo_dark);        share.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);        /***************************************************/        SubMenu addMenu = menu.addSubMenu(0, 2, 3, "overflow");        addMenu.add(0, 3, 0, "更换主题");        addMenu.add(0, 4, 0, "系统设置");        addMenu.add(0, 5, 0, "修改密码");        addMenu.add(0, 6, 0, "更换头像");        MenuItem overFlowItem = addMenu.getItem();        overFlowItem.setIcon(R.drawable.abs__ic_menu_moreoverflow_holo_dark);        overFlowItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);        return super.onCreateOptionsMenu(menu);    }    /**     * Create the search view(搜索的核心代码)     *      * @param menu     * @return void     * @author hsx     * @time 2014-3-16下午03:48:01     */    private void createSearchItem(com.actionbarsherlock.view.Menu menu) {        SearchView searchView = new SearchView(getSupportActionBar().getThemedContext());        searchView.setQueryHint("Search for countries…");        searchView.setOnQueryTextListener(this);        searchView.setOnSuggestionListener(this);        if (mSuggestionsAdapter == null) {            MatrixCursor cursor = new MatrixCursor(COLUMNS);            cursor.addRow(new String[] { "1", "'Murica" });            cursor.addRow(new String[] { "2", "Canada" });            cursor.addRow(new String[] { "3", "Denmark" });            mSuggestionsAdapter = new QuerySuggestionsAdapter(getSupportActionBar().getThemedContext(), cursor);        }        searchView.setSuggestionsAdapter(mSuggestionsAdapter);        MenuItem searchItem = menu.add(0, 0, 0, "search");        searchItem.setIcon(R.drawable.abs__ic_search);        searchItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);        searchItem.setActionView(searchView);    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {        switch (item.getItemId()) {        case 1:            ToastUtil.showShortToast(MainActivity.this, "分享");            break;        case 3:            ToastUtil.showShortToast(MainActivity.this, "更换主题");            break;        case 4:            ToastUtil.showShortToast(MainActivity.this, "系统设置");            break;        case 5:            ToastUtil.showShortToast(MainActivity.this, "修改密码");            break;        case 6:            ToastUtil.showShortToast(MainActivity.this, "更换头像");            break;        }        return super.onOptionsItemSelected(item);    }    /***     * implements SearchView.OnQueryTextListener     */    @Override    public boolean onQueryTextSubmit(String query) {        ToastUtil.showShortToast(this, "You searched for: " + query);        return true;    }    /***     * implements SearchView.OnQueryTextListener     */    @Override    public boolean onQueryTextChange(String newText) {        return false;    }    /**     * implements SearchView.OnSuggestionListener     */    @Override    public boolean onSuggestionSelect(int position) {        return false;    }    /**     * implements SearchView.OnSuggestionListener     */    @Override    public boolean onSuggestionClick(int position) {        Cursor c = (Cursor) mSuggestionsAdapter.getItem(position);        String query = c.getString(c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1));        ToastUtil.showShortToast(this, "Suggestion clicked: " + query);        return true;    }}

/*******************************************************************************************************************************/

QuerySuggestionsAdapter

package com.hsx.wangcuo.adapter;import android.app.SearchManager;import android.content.Context;import android.database.Cursor;import android.support.v4.widget.CursorAdapter;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;public class QuerySuggestionsAdapter extends CursorAdapter {    public QuerySuggestionsAdapter(Context context, Cursor c) {        super(context, c, 0);    }    @Override    public View newView(Context context, Cursor cursor, ViewGroup parent) {        LayoutInflater inflater = LayoutInflater.from(context);        View v = inflater.inflate(android.R.layout.simple_list_item_1, parent, false);        return v;    }    @Override    public void bindView(View view, Context context, Cursor cursor) {        TextView tv = (TextView) view;        final int textIndex = cursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1);        tv.setText(cursor.getString(textIndex));    }}

效果图如下:

device-2014-03-18-164601

 

还有一个小的bug,没有找到解决方法:输入一个字母的时候,不弹出提示

device-2014-03-18-164645

 

 

demo的地址 :   http://download.csdn.net/detail/abc13939746593/7061035





0 0
原创粉丝点击