简体   繁体   English

Action Bar Sherlock SearchView不会扩展点击它

[英]Action Bar Sherlock SearchView not expanding on click of it

I have one Sherlock Fragment Activity from which i am setting the different sherlock fragments using fragment pager adapter. 我有一个Sherlock Fragment Activity,我使用片段寻呼机适配器设置不同的sherlock片段。

Now to show the searchview in each of the fragment i have placed this method in onCreate of Fragment:: 现在在每个片段中显示searchview我已将此方法放在onCreate of Fragment ::

This method will show menu items in the ActionBar of the fragment. 此方法将在片段的ActionBar中显示菜单项。

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }

I have now also set the onCreateOptionMenu() like this :: 我现在也像这样设置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");
}

Now the strange things happens that in my first fragment i have done the same thing and the searchview get opened successfully. 现在奇怪的事情发生了,在我的第一个片段中我做了同样的事情,搜索视图成功打开。

If 如果

  • i go to the first fragment,open the searchview then go to the second 我转到第一个片段,打开searchview,然后转到第二个片段
  • fragment the searchview will get opened. 片段搜索视图将被打开。

Same thing happens for third fragment 第三个片段也是如此

  • go to 3rd fragment, 转到第3片段,
  • open searchview, 打开searchview,
  • back to the second frgment,searchview get opened. 回到第二个片段,searchview开启了。

But if i go to directly on the second fragment the searchview not get opened. 但是,如果我直接转到第二个片段,则不会打开searchview。

Hope i am clear. 希望我很清楚。

Any clue about this? 关于这个的任何线索? Any suggestion/links will be appreciated.. 任何建议/链接将不胜感激..

Thanks in Advance... 提前致谢...

EDIT :: 编辑::

menu.xml 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 :: 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)

We generally use onCreateOptionsMenu() for creating Options Menu for fragments and activities. 我们通常使用onCreateOptionsMenu()来创建片段和活动的选项菜单。 If you go through the documentation, there's another helper method called onPrepareOptionsMenu() which, as per the documentation says: 如果你浏览文档,还有另一个名为onPrepareOptionsMenu()辅助方法,根据文档说明:

Prepare the Screen's standard options menu to be displayed. 准备要显示的屏幕标准选项菜单。 This is called right before the menu is shown, every time it is shown. 每次显示菜单时都会调用此菜单。 You can use this method to efficiently enable/disable items or otherwise dynamically modify the contents. 您可以使用此方法有效地启用/禁用项目或以其他方式动态修改内容。

SearchView expanding/collapsing works fine when we are not instantiating fragments inside ViewPager or anything similar tab like switching scenarios. 当我们没有在ViewPager实例化片段或任何类似的选项卡(如切换场景)时, SearchView扩展/折叠工作正常。 I've had the same problem once. 我曾经遇到过同样的问题。 I came up with using onPrepareOptionsMenu() to resolve my problem. 我想出了使用onPrepareOptionsMenu()来解决我的问题。

Just implement onPrepareOptionsMenu() in each of your fragments and inside of it, call onQueryTextChange("") passing "" as query string. 只需在每个片段及其内部实现onPrepareOptionsMenu() ,调用onQueryTextChange("")作为查询字符串传递"" It will do the trick to suggest the fragment container activity that this fragment wants to mind his own searching business. 它将诀窍建议片段容器活动,这个片段想要介意他自己的搜索业务。

OR , Not sure, but a call to invalidateOptionsMenu() on container activity could also come handy. 或者,不确定,但是对容器活动的invalidateOptionsMenu()调用也可以派上用场。

Let me know if that helps. 如果有帮助,请告诉我。

EDIT: 编辑:

My Implementation: 我的实施:

@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;
    }

I have achieved what i want finally but with one problem.. I don't know whatever i have done is the hack/patch or the correct way but it is working fine in <3.0 but now find the issue in >=3.0. 我已经实现了我想要的最终但有一个问题..我不知道我做了什么是黑客/补丁或正确的方法,但它在<3.0但是现在在> = 3.0中找到了问题。

What i have done is :: 我做的是::

In My Container Activity i have declare the onCreateOptionsMenu() and onPrepareOptionsMenu() :: 在我的容器活动中,我声明了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);
    }

Now in each Fragment's onCreateOptionsMenu() i have done something like this :: 现在在每个Fragment的onCreateOptionsMenu()中,我做了类似这样的事情::
I have checked the build version of OS and based on that i manupulate my option menu like below .. 我检查了操作系统的构建版本,并根据我的操作我的选项菜单,如下所示..

@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);
        }
    }

It's working fine in 2.3.3 but problem m facing now is in 3.0 + 它在2.3.3中运行良好,但现在面临的问题是3.0 +

1)not able to see the hint after expanding the searchview 1)扩展搜索视图后无法看到提示
2)expand the searchview in first fragment... 2)在第一个片段中展开searchview ... 在此输入图像描述

3)Move to second fragment(without collapsing the searchview ) 3)移动到第二个片段(不折叠搜索视图) 在此输入图像描述

4)Now in second fragment expand the searchview of current fragment 4)现在在第二个片段中展开当前片段的搜索视图 在此输入图像描述

5)in Current Fragment Pressed Back then the result is mess :( 5)在当前碎片按下然后结果是混乱:(

在此输入图像描述

EDIT :: 编辑::

I have done the following changes in my Container Activity and now its working fine,Finally i have achieved what i want.... 我在容器活动中做了以下更改,现在工作正常,最后我实现了我想要的......

  @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);
        }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM