2

ActionBarSherlockの検索ビューを使用してリストにフィルターを作成しようとしています。私が現在持っているコードは次のとおりです。

@Override
public boolean onCreateOptionsMenu(final Menu menu) {
    getSupportMenuInflater().inflate(R.menu.building_search, menu);

    SearchView searchView = new SearchView(getSupportActionBar().getThemedContext());

    SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() 
    {
        public boolean onQueryTextChange(String newText) 
        {
            // this is your adapter that will be filtered
            listAdapter.getFilter().filter(newText);
            return true;
        }

        public boolean onQueryTextSubmit(String query) 
        {
            // this is your adapter that will be filtered
            listAdapter.getFilter().filter(query);
            return true;
        }
    };
    searchView.setOnQueryTextListener(queryTextListener);

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.search:
            onSearchRequested();
            return true;
    }
    return super.onOptionsItemSelected(item);
}

これらは私の輸入品です:

import android.os.Bundle;
import android.widget.AbsListView;
import android.widget.ArrayAdapter;
import be.ugent.zeus.hydra.AbstractSherlockActivity;
import be.ugent.zeus.hydra.R;
import be.ugent.zeus.hydra.data.caches.AssociationsCache;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.widget.SearchView;
import com.dd.plist.NSArray;
import com.dd.plist.NSDictionary;
import com.dd.plist.NSString;
import com.dd.plist.XMLPropertyListParser;
import com.emilsjolander.components.stickylistheaders.StickyListHeadersListView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.logging.Level;
import java.util.logging.Logger;

ほとんどが機能します。アクションバーに検索アイコンが表示されます。これはクリック可能で、検索ビューを展開します。ただし、機能しないのは実際のリスナーです。両方のメソッド内にブレークポイントを設定しましたが、デバッグしても何も起こりません。プログラムは壊れず、何もフィルタリングされず、理由がわかりません。

誰かが何か考えを持っていますか?

前もって感謝します。

4

4 に答える 4

5

これが、ActionBarSherlockを使用して検索を実装した方法です。

res / menuフォルダーの下のmenu.xmlに、アイコンを追加しました。

    <item android:id="@+id/search"
      android:title="@string/search_title"
      android:icon="@drawable/ic_search"
      android:showAsAction="collapseActionView|ifRoom" 
      android:actionViewClass="com.actionbarsherlock.widget.SearchView"/>

次に、アクション検索クエリの受信とデータの表示を担当するクラスを作成しました。

    public class SearchActivity extends SherlockFragmentActivity{

    @Override
        protected void onCreate(Bundle savedInstanceState) {
       Log.d(TAG, "This is the search view activity");
       // TODO Auto-generated method stub
       super.onCreate(savedInstanceState);
       setContentView(R.layout.search_result_layout);
            }


    private void handleIntent(Intent intent){
        if(Intent.ACTION_SEARCH.equals(intent.getAction())){
        searcdhQuery = intent.getStringExtra(SearchManager.QUERY);
        //here we shall do e search..
        Log.d(TAG, "This is the search query:" + searcdhQuery);

                    //This is the asynctask query to connect to the database...
        String[] value = {searcdhQuery};
        SearchQuery searchQuery = new SearchQuery();
        searchQuery.execute(value);
        }
        }

            @Override
        protected void onNewIntent(Intent intent) {
         // TODO Auto-generated method stub
         super.onNewIntent(intent);
         handleIntent(intent);
        }
        }

マニフェストでは、このアクティビティは、以下に示すように検索および表示フィルターに含まれています。

    <activity android:name=".SearchActivity"
        android:launchMode="singleTop">
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
        </intent-filter>
        <meta-data 
            android:name="android.app.searchable"
            android:resource="@xml/searchable"/>
    </activity>

また、マニフェストでは、以下に示すように、アクティビティのデフォルトの検索を示すアプリケーションのメタデータを忘れないでください。

    <meta-data android:name="android.app.default_searchable"
                    android:value=".SearchActivity" />

最後に、onCreateOptionsMenuで、検索サービスに関連付けて検索構成を追加してください。

    //associating the searchable configuration with the search service...
    SearchManager searchManager = (SearchManager)getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView)menu.findItem(R.id.search).getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

onOptionsItemSelectedメソッドには何も必要ありません。

これは私にとって完璧に機能しました。詳細が必要な場合は、actionBarSherlockの検索ビューデモおよび検索インターフェイスの設定に関する開発者向けチュートリアルから詳細情報を見つけてください。

これがお役に立てば幸いです。

于 2013-02-24T09:48:03.513 に答える
3

あなたが答えを見つけられなかった場合、これは私がそれをしている方法です(私はActionBarSherlockを使用しています):

  • メニュー宣言にエントリを追加します

      <item android:id="@+id/menu_search"
        android:actionViewClass="com.actionbarsherlock.widget.SearchView"
        android:icon="@drawable/wfm_menu_search"
        android:showAsAction="always|withText|collapseActionView"
        android:title="@string/menu_search"/>
    
  • アクティビティで「onCreateOptionsMenu」をオーバーライドしてメニューを膨らませ、SearcViewを関連付けます。

    public boolean onCreateOptionsMenu(final Menu menu) {
        getSupportMenuInflater().inflate(R.menu.main_menu, menu);
        this.refreshMenuItem = menu.findItem(R.id.menu_refresh);
    
        this.searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
        this.searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
    
        @Override
        public boolean onQueryTextSubmit(String query) {
            // collapse the view ?
            menu.findItem(R.id.menu_search).collapseActionView();
            return false;
        }
    
        @Override
        public boolean onQueryTextChange(String newText) {
            // search goes here !!
            // listAdapter.getFilter().filter(query);
            return false;
        }
    
    });
    

それだけです、他の活動はありません。お役に立てば幸いです。

于 2013-04-14T10:48:28.307 に答える
1

それはあなたの完全なコードですか?今、onCreateOptionsMenuあなたはを作成し、SearchViewそれに割り当てOnQueryTextListenerますが、それはあなたがそれで行うすべてです。SearchView膨らんだメニューにこれを追加するコードが表示されません。

画面にウィジェットが表示されていると言うように、R.menu.building_searchファイルでウィジェットを宣言していると仮定します。その場合は、そのウィジェットを探す必要があります(リスナーが設定されていないため、アクションは実行されません)。新しいものを宣言しない(ユーザーと対話しない):

SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();

(これはAndroid開発者サイトの検索ガイドからのものです。私が間違っていなければ、これはActionBarSherlockでも機能するはずです)。

于 2013-02-21T08:46:16.583 に答える
1

他のすべての回答には少し真実が含まれていましたが、質問に完全には回答しなかったため、独自の回答を作成します。

この問題が発生したとき(半年前)、ABSはSearchView機能を完全には実装していませんでした。ABS 4.2.0以降、これが実装されています。

ABSサンプルアプリに従うことによる私の完全な実装は、ここにあります。

于 2013-09-16T14:18:16.337 に答える