我需要在ActionBar中显示SearchView总是展开和另外一个按钮,以便用户快速访问Search Activity中的搜索字符串.
我的活动有这个菜单布局:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/action_search"
android:title="@string/action_search"
android:icon="@drawable/ic_action_search"
android:showAsAction="always"
android:actionViewClass="com.actionbarsherlock.widget.SearchView"/>
<item android:id="@+id/action_configure"
android:title="@string/action_configure"
android:icon="@android:drawable/ic_menu_preferences"
android:showAsAction="always" />
</menu>
Run Code Online (Sandbox Code Playgroud)
在Search活动类中,我按如下方式配置ActionBar:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.search, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView)menu.findItem(R.id.action_search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(false);
searchView.setSubmitButtonEnabled(false);
return true;
}
Run Code Online (Sandbox Code Playgroud)
问题是,如果我这样做,searchView.setIconifiedByDefault(false);我会看到这张图片:

您可以注意到没有第二个菜单项.在这里,如果我设置android:showAsAction ="always | collapseActionView",它默认会折叠,但我现在可以看到第二项:

在上图中我已按下搜索图标
有两个问题我无法弄清楚:
当我尝试在文档中配置SearchView时,如果使用ActionBarSherlock,我会收到此错误:
FATAL EXCEPTION: main
java.lang.ClassCastException: android.widget.SearchView cannot be cast to com.actionbarsherlock.widget.SearchView
at MY_PACKAGE.ACTIVITY.onCreateOptionsMenu(MenuDrawerBase.java:181)
at android.support.v4.app.Watson.onCreatePanelMenu(Watson.java:45)
at com.actionbarsherlock.ActionBarSherlock.callbackCreateOptionsMenu(ActionBarSherlock.java:559)
at com.actionbarsherlock.internal.ActionBarSherlockNative.dispatchCreateOptionsMenu(ActionBarSherlockNative.java:60)
at com.actionbarsherlock.app.SherlockFragmentActivity.onCreatePanelMenu(SherlockFragmentActivity.java:165)
at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:393)
at com.android.internal.policy.impl.PhoneWindow.invalidatePanelMenu(PhoneWindow.java:747)
at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:2913)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
我的代码与示例完全相同:
import com.actionbarsherlock.view.*;
import com.actionbarsherlock.widget.SearchView;
......
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.main, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView)menu.findItem(R.id.action_search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(true);
searchView.setSubmitButtonEnabled(true);
return true;
}
Run Code Online (Sandbox Code Playgroud)
没有找到这方面的描述所以问你:这是什么?
顺便说一下,如果我使用 …
我们正在尝试在Postgresql中创建OEBS模拟功能.假设我们有一个表单构造函数,需要将表单结果存储在数据库中(例如电子邮件正文).在Oracle中,您可以使用包含150~列的表(以及存储在其他位置的某些映射)来将每个字段存储在单独的列中.但与Oracle相反,我们希望将所有表单存储在postgresql xml字段中.树的例子是
<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<object_id>2</object_id>
<pack_form_id>23</pack_form_id>
<prod_form_id>34</prod_form_id>
</row>
Run Code Online (Sandbox Code Playgroud)
我们想搜索这个字段.测试表包含400k行,以下选择在90秒内执行:
select *
from params
where (xpath('//prod_form_id/text()'::text, xmlvalue))[1]::text::int=34
Run Code Online (Sandbox Code Playgroud)
所以我创建了这个索引:
create index prod_form_idx
ON params using btree(
((xpath('//prod_form_id/text()'::text, xmlvalue))[1]::text::int)
);
Run Code Online (Sandbox Code Playgroud)
它没有任何区别.执行仍然是90秒.EXPLAIN计划显示:
Bitmap Heap Scan on params (cost=40.29..6366.44 rows=2063 width=292)
Recheck Cond: ((((xpath('//prod_form_id/text()'::text, xmlvalue, '{}'::text[]))[1])::text)::integer = 34)
-> Bitmap Index Scan on prod_form_idx (cost=0.00..39.78 rows=2063 width=0)
Index Cond: ((((xpath('//prod_form_id/text()'::text, xmlvalue, '{}'::text[]))[1])::text)::integer = 34)
Run Code Online (Sandbox Code Playgroud)
我不是伟大的计划解释器所以我想这意味着正在使用索引.问题是:速度在哪里?我能做些什么来优化这种查询?