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无论是否溢出,总会显示。withTextwithText值示意Action bar要显示文本标题。Action bar会尽可能的显示这个
标题,但是,如果图标有效并且受到Action bar空间的限制,文本标题有可
能显示不全。
声明了这个操作视窗应该被折叠到一个按钮中,当用户选择这个按钮时,这个操作视窗展开。否则,
这个操作视窗在默认的情况下是可见的,并且即便在用于不适用的时候,也要占据操作栏的有效空间。
一般要配合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); }}
效果图 如下 :
四、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)); }}
效果图如下:
还有一个小的bug,没有找到解决方法:输入一个字母的时候,不弹出提示
demo的地址 : http://download.csdn.net/detail/abc13939746593/7061035
- ActionBarSherlock的学习笔记
- ActionBarSherlock学习笔记——初始化控件
- ActionBarSherlock学习笔记——requestWindowFeature
- ActionBarSherlock学习笔记——SearchView
- ActionBarSherlock学习笔记——ShareActionProvider
- ActionBarSherlock学习笔记——知识点
- ActionBarSherlock学习笔记——SubMenu
- ActionBarSherlock学习笔记——ActionBar.Tab
- Android开源项目学习笔记(一)--ActionBarSherlock
- ActionBarSherlock学习笔记 第一篇——部署
- ActionBarSherlock学习笔记 第一篇——部署
- ActionBarSherlock学习笔记——SupportActionBar()属性设置
- ActionBarSherlock学习笔记 第一篇——部署
- ActionBarSherlock学习笔记——添加组件Menu
- ActionBarSherlock学习笔记——ActionBar添加View
- ActionBarSherlock学习笔记——SupportActionBar()属性设置
- actionbarsherlock学习(2)
- actionbarsherlock学习(3)
- java.lang.NullPointerException: Attempt to invoke virtual method 'void java.io.BufferedOutputStream.
- CMake 编译openCV静态库(*.a)for 安卓
- gcc编译链接的一些总结
- PHP 数据库相关函数
- codeforces455A-Boredom
- ActionBarSherlock的学习笔记
- java替换string值变更为JSONObject或JSONArray方法
- 增强现实设备之Magic Leap & Hololens
- Cache-Control max-age=0
- 关于使用Hibernate出现的多种常见错误的原因及解决办法
- Android去Title和主题Theme使用方法
- pdf格式的文件怎么修改
- C/Python实现直接选择排序
- java 值传递简单透彻理解