1

几次尝试在#android-dev(irc)中提出这个问题并进行了数小时的搜索,但我仍然没有解决这个问题的方法。

我目前正在研究我的 android 音乐播放器中的搜索功能。我正在使用令人惊叹的 ActionBarSherlock 为较旧的 android 版本提供支持。

我的问题如下:当用户点击搜索菜单/动作按钮时,点击动作的actionView应该被展开,并且应该显示一个新的片段(searchFragment)而不是当前活动的片段。但是,当我尝试这样做时,actionView 不会扩展。

我尝试在不添加 SearchFragment 的情况下扩展 actionView,在这种情况下,actionView 会扩展。然而,这种组合似乎是不可能的。

这是我的代码:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item != null) {
        if (item.getItemId() == R.id.collectionactivity_search_menu_button) {
            item.expandActionView();
            mTabsAdapter.replace(new SearchFragment(), false);
            return true;
        }
    }
    return false;
}

/**
 * Replaces the view pager fragment at specified position.
 */
public void replace(int position, Fragment newFragment, boolean isBackAction) {
    // Get currently active fragment.
    ArrayList<Fragment> fragmentsStack = mFragments.get(position);
    Fragment currentFragment = fragmentsStack.get(fragmentsStack.size() - 1);
    if (currentFragment == null) {
        return;
    }
    // Replace the fragment using a transaction.
    this.startUpdate(mViewPager);
    FragmentTransaction ft = mFragmentManager.beginTransaction();
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    ft.attach(newFragment).remove(currentFragment).commit();
    if (isBackAction == true)
        fragmentsStack.remove(currentFragment);
    else
        fragmentsStack.add(newFragment);
    this.notifyDataSetChanged();
    this.finishUpdate(mViewPager);
}

mTabsAdapter.replace(...) 方法将当前显示的片段替换为第一个参数中的片段。此外,片段被添加到自定义 backStack。在扩展视图之前或之后替换片段没有任何区别。

希望有人能够帮助我:)提前谢谢!

4

2 回答 2

2

您是否尝试过将您的操作视图 android:showAsAction 设置为 collapseActionView?这样您就不必管理展开/关闭操作。如果这不起作用,你可以用另一种方式处理它,你设置一个扩展侦听器并在你的动作视图开始扩展时替换你的片段

item.setOnActionExpandListener(new OnActionExpandListener() {
    @Override
    public boolean onMenuItemActionCollapse(MenuItem item) {
        // Do something when collapsed
        return true;  // Return true to collapse action view
    }

    @Override
    public boolean onMenuItemActionExpand(MenuItem item) {
       mTabsAdapter.replace(new SearchFragment(), false);
        return true;  // Return true to expand action view
    }
});

记得返回true让actionview展开

于 2012-10-04T20:23:07.927 回答
0

我发现问题是由什么引起的。

我的 mTab​​sAdapter.replace(..) 方法正在调用 notifyDataSetChanged();。所以每次我替换片段时,都会调用 onPrepareOptionsMenu,导致搜索操作按钮被删除并再次添加,从而导致 actionView 被折叠。

对此的解决方案是修复我的 onPrepareOptionsMenu,因此每当调用 onPrepareOptionsMenu 并且之前已展开 actionView 时,actionView 将再次展开。

于 2012-10-05T13:46:18.850 回答