我有一个Sherlock Fragment Activity,我使用片段寻呼机适配器设置不同的sherlock片段。
现在显示每个片段中的searchview我已将此方法放在onCreate of Fragment ::
此方法将在片段的ActionBar中显示菜单项。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
我现在也设置了onCreateOptionMenu(),就像这样::
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.menu, menu);
final MenuItem searchItem = menu.findItem(R.id.menu_item_search);
final SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setQueryHint("Search Here");
}
现在奇怪的事情发生了,在我的第一个片段中,我做了同样的事情,并且搜索视图成功打开。
如果
同样的事情发生在第三个片段
但如果我直接转到第二个片段,则不会打开searchview。
希望我很清楚。
有关此问题的任何线索? 任何建议/链接将不胜感激..
提前致谢...
编辑::
menu.xml文件
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_item_search"
android:icon="@drawable/abs__ic_search"
android:showAsAction="ifRoom|collapseActionView"
android:actionViewClass="com.actionbarsherlock.widget.SearchView"
android:title="Search Products">
</item>
<item
android:id="@+id/root_menu"
android:icon="@drawable/abs__ic_menu_moreoverflow_normal_holo_light"
android:showAsAction="always"
android:title="More">
<menu>
<item
android:id="@+id/menu_Home"
android:icon="@drawable/home"
android:showAsAction="never"
android:title="Home"/>
<item
android:id="@+id/menu_favourite"
android:icon="@drawable/favourite"
android:showAsAction="never"
android:title="Favourite"/>
<item
android:id="@+id/menu_Balance"
android:icon="@drawable/balance"
android:showAsAction="never"
android:title="Balance"/>
<item
android:id="@+id/menu_logout"
android:icon="@drawable/btn_logout"
android:showAsAction="never"
android:title="Logout"/>
</menu>
</item>
</menu>
Logcat ::
12-06 16:45:26.401: E/AndroidRuntime(1581): FATAL EXCEPTION: main
12-06 16:45:26.401: E/AndroidRuntime(1581): java.lang.ClassCastException: com.mobifin.subscriber.ButtonPayActivity
12-06 16:45:26.401: E/AndroidRuntime(1581): at com.mobifin.subscriber.home.BillPayFragment.onCreateOptionsMenu(BillPayFragment.java:101)
12-06 16:45:26.401: E/AndroidRuntime(1581): at android.support.v4.app.Watson.onCreatePanelMenu(Watson.java:55)
12-06 16:45:26.401: E/AndroidRuntime(1581): at com.actionbarsherlock.ActionBarSherlock.callbackCreateOptionsMenu(ActionBarSherlock.java:560)
12-06 16:45:26.401: E/AndroidRuntime(1581): at com.actionbarsherlock.internal.ActionBarSherlockCompat.preparePanel(ActionBarSherlockCompat.java:466)
12-06 16:45:26.401: E/AndroidRuntime(1581): at com.actionbarsherlock.internal.ActionBarSherlockCompat.dispatchInvalidateOptionsMenu(ActionBarSherlockCompat.java:265)
12-06 16:45:26.401: E/AndroidRuntime(1581): at com.actionbarsherlock.app.SherlockFragmentActivity.invalidateOptionsMenu(SherlockFragmentActivity.java:149)
12-06 16:45:26.401: E/AndroidRuntime(1581): at com.actionbarsherlock.app.SherlockFragmentActivity.supportInvalidateOptionsMenu(SherlockFragmentActivity.java:155)
12-06 16:45:26.401: E/AndroidRuntime(1581): at android.support.v4.app.Fragment.setMenuVisibility(Fragment.java:726)
12-06 16:45:26.401: E/AndroidRuntime(1581): at android.support.v4.app.FragmentPagerAdapter.setPrimaryItem(FragmentPagerAdapter.java:127)
12-06 16:45:26.401: E/AndroidRuntime(1581): at android.support.v4.view.ViewPager.populate(ViewPager.java:802)
12-06 16:45:26.401: E/AndroidRuntime(1581): at android.support.v4.view.ViewPager.completeScroll(ViewPager.java:1280)
12-06 16:45:26.401: E/AndroidRuntime(1581): at android.support.v4.view.ViewPager.computeScroll(ViewPager.java:1176)
12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.ViewGroup.drawChild(ViewGroup.java:1562)
12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.View.draw(View.java:6883)
12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.View.draw(View.java:6883)
12-06 16:45:26.401: E/AndroidRuntime(1581): at android.widget.FrameLayout.draw(FrameLayout.java:357)
12-06 16:45:26.401: E/AndroidRuntime(1581): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1862)
12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.ViewRoot.draw(ViewRoot.java:1522)
12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.ViewRoot.performTraversals(ViewRoot.java:1258)
12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
12-06 16:45:26.401: E/AndroidRuntime(1581): at android.os.Handler.dispatchMessage(Handler.java:99)
12-06 16:45:26.401: E/AndroidRuntime(1581): at android.os.Looper.loop(Looper.java:130)
12-06 16:45:26.401: E/AndroidRuntime(1581): at android.app.ActivityThread.main(ActivityThread.java:3683)
12-06 16:45:26.401: E/AndroidRuntime(1581): at java.lang.reflect.Method.invokeNative(Native Method)
12-06 16:45:26.401: E/AndroidRuntime(1581): at java.lang.reflect.Method.invoke(Method.java:507)
12-06 16:45:26.401: E/AndroidRuntime(1581): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
12-06 16:45:26.401: E/AndroidRuntime(1581): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
12-06 16:45:26.401: E/AndroidRuntime(1581): at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:2)
我们通常使用onCreateOptionsMenu()
为片段和活动创建选项菜单。
如果你阅读文档,那么还有一个名为onPrepareOptionsMenu()
的辅助方法,根据文档说明:
准备要显示的屏幕标准选项菜单。这是 每次显示菜单时,都会在菜单显示之前调用。您可以 使用此方法有效地启用/禁用项目或其他 动态修改内容。
SearchView
扩展/折叠在我们没有实例化ViewPager
内的片段或任何类似标签(如切换场景)时工作正常。我曾经遇到过同样的问题。
我想出了使用onPrepareOptionsMenu()
来解决我的问题。
只需在每个片段及其内部实施onPrepareOptionsMenu()
,请将onQueryTextChange("")
作为查询字符串调用""
。它将诀窍建议片段容器活动,这个片段想要介意他自己的搜索业务。
或者,不确定,但是对容器活动的invalidateOptionsMenu()
调用也可以派上用场。
如果有帮助,请告诉我。
修改强>
我的实施:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
SearchView searchView = new SearchView(getActivity());
searchView.setQueryHint("Search for Events");
searchView.setOnQueryTextListener(this);
menu.add(0, ACTION_SEARCH, 0, "Search")
.setIcon(R.drawable.ic_mailbox_search)
.setActionView(searchView)
.setOnActionExpandListener(menuExpandListener)
.setShowAsAction(
MenuItem.SHOW_AS_ACTION_IF_ROOM
| MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
onQueryTextChange("");
}
@Override
public boolean onQueryTextSubmit(String query) {
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
if (mAdapter != null)
mAdapter.getFilter().filter(newText);
return false;
}
答案 1 :(得分:0)
我已经达到了我想要的最终但有一个问题.. 我不知道我做了什么是黑客/补丁或正确的方法,但它在&lt; 3.0中正常工作但现在在&gt; = 3.0中找到问题。
我所做的是::
在我的容器活动中,我声明了onCreateOptionsMenu()和onPrepareOptionsMenu()::
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
super.onCreateOptionsMenu(menu);
getSupportMenuInflater().inflate(R.menu.menu, menu);
return true;
}
public boolean onPrepareOptionsMenu(Menu menu)
{
if(versionStatus==0)
{
menu.findItem(R.id.root_menu).setVisible(false);
}
return super.onPrepareOptionsMenu(menu);
}
现在在每个Fragment的onCreateOptionsMenu()中,我做了类似这样的事情::
我已经检查了操作系统的构建版本,并根据我的选项菜单如下所示..
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
super.onCreateOptionsMenu(menu, inflater);
int currentapiVersion = android.os.Build.VERSION.SDK_INT;
int versionStatus = 0;
if (currentapiVersion == android.os.Build.VERSION_CODES.FROYO || currentapiVersion == android.os.Build.VERSION_CODES.GINGERBREAD)
{
versionStatus=0;
}
else if(currentapiVersion >= android.os.Build.VERSION_CODES.HONEYCOMB)
{
versionStatus=1;
}
if(versionStatus==1)
{
inflater.inflate(R.menu.menu, menu);
menu.findItem(R.id.menu_item_search).setVisible(false);
final MenuItem searchItem = menu.findItem(R.id.menu_item_search);
SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setQueryHint("Search Products");
searchView.setIconifiedByDefault(false);
searchView.setOnQueryTextListener(this);
}
else
{
inflater.inflate(R.menu.menu, menu);
final MenuItem searchItem = menu.findItem(R.id.menu_item_search);
SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setQueryHint("Search Products");
searchView.setIconifiedByDefault(false);
searchView.setOnQueryTextListener(this);
}
}
它在2.3.3中工作正常,但现在面临的问题是3.0 +
1)扩展搜索视图后无法看到提示 2)在第一个片段中展开searchview ...
3)移动到第二个片段(不折叠搜索视图)
4)现在在第二个片段中展开当前片段的搜索视图
5)在当前碎片按下然后结果是混乱:(
编辑::
我在容器活动中做了以下更改,现在工作正常,最后我已经实现了我想要的......
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
super.onCreateOptionsMenu(menu);
if(versionStatus==0)
{
getSupportMenuInflater().inflate(R.menu.menu, menu);
}
return true;
}
public boolean onPrepareOptionsMenu(Menu menu)
{
if(versionStatus==0)
{
menu.findItem(R.id.root_menu).setVisible(false);
}
return super.onPrepareOptionsMenu(menu);
}