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

actionviews 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を返すことを忘れないでください

于 2012-10-04T20:23:07.927 に答える
0

問題の原因を突き止めました。

私のmTabsAdapter.replace(..)メソッドはnotifyDataSetChanged();を呼び出していました。そのため、フラグメントを置き換えるたびに、onPrepareOptionsMenuが呼び出され、検索アクションボタンが削除されて再度追加され、actionViewが折りたたまれていました。

これに対する解決策は、onPrepareOptionsMenuを修正することです。これにより、onPrepareOptionsMenuが呼び出され、以前にactionViewが展開された場合は常に、actionViewが再度展開されます。

于 2012-10-05T13:46:18.850 に答える