扩展actionBar-ActionView并显示新的Fragment

时间:2012-10-04 19:48:17

标签: android android-fragments android-actionbar actionbarsherlock actionview

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

我正在研究我的Android音乐播放器中的搜索功能。我正在使用惊人的ActionBarSherlock来为旧的Android版本提供支持。

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

我试图扩展actionView,而不添加SearchFragment,在这种情况下,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);
}

mTab​​sAdapter.replace(...)方法将当前显示的Fragment替换为第一个参数中的一个。另外,该片段正被添加到自定义backStack中。 在展开View之前或之后替换Fragment没有任何区别。

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

2 个答案:

答案 0 :(得分: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展开

答案 1 :(得分:1)

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

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

解决这个问题的方法是修复我的onPrepareOptionsMenu,这样只要调用onPrepareOptionsMenu并且之前展开了actionView,actionView就会再次展开。