【问题标题】:Action Bar Sherlock SearchView not expanding on click of it操作栏 Sherlock SearchView 在单击时未展开
【发布时间】:2013-12-23 13:48:45
【问题描述】:

我有一个 Sherlock 片段活动,我正在使用片段寻呼机适配器设置不同的 sherlock 片段。

现在要在每个片段中显示搜索视图,我已将此方法放在片段的 onCreate 中::

此方法将在片段的 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");
}

现在奇怪的事情发生了,在我的第一个片段中我做了同样的事情并且搜索视图被成功打开。

如果

  • 我转到第一个片段,打开搜索视图然后转到第二个
  • 将打开搜索视图的片段。

第三个片段也会发生同样的事情

  • 转到第三个片段,
  • 打开搜索视图,
  • 回到第二个片段,搜索视图打开。

但如果我直接进入第二个片段,搜索视图不会打开。

希望我清楚。

对此有任何线索吗? 任何建议/链接将不胜感激..

在此先感谢...

编辑 ::

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)

【问题讨论】:

  • 你能粘贴你的 menu.xml 文件吗?这可能有助于确定问题。
  • @Puru 请检查我的编辑。

标签: android actionbarsherlock fragment searchview


【解决方案1】:

我终于实现了我想要的,但有一个问题.. 我不知道我所做的是破解/补丁还是正确的方法,但它在 =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)在第一个片段中展开搜索视图...

3) 移动到第二个片段(不折叠搜索视图)

4) 现在在第二个片段中展开当前片段的搜索视图

5)in Current Fragment Pressed Back 然后结果是一团糟:(

编辑 ::

我在我的容器活动中做了以下更改,现在它工作正常,终于实现了我想要的......

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

【讨论】:

    【解决方案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;
        }
    

    【讨论】:

    • 所以你想说我应该将我的 onCreateOptionMenu() 代码删除到 onPrepareOptionMenu() ?如果我错了,请纠正我...
    • 没有。保持 onCreateOptionsMenu() 将 onQueryTextChangeListener 添加到 searchView 并添加 onPrepareOptionsMenu()。查看我的编辑。
    • 我已经按照你所说的进行了更改,但是我的应用程序崩溃了。我已将代码粘贴到我的编辑中,还提到了我的应用程序崩溃的行...请查看这个..跨度>
    • 片段需要实现OnQueryTextListener。在实现传递“this”作为参数之后;例如。 searchView.setOnQueryTextListener(this);
    • 我已经在 Fragment 中实现了 onQueryTextListener()。但结果将是相同的。我正在使用 searchView.setOnQueryTextListener((OnQueryTextListener) ctx); 在 fragment.so m 的构造函数中获取上下文中的上下文以使用 onQueryTextListener ...查看我的编辑...
    猜你喜欢
    • 2014-06-16
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多