2014-12-06 209 views
0

我創建了一個應用程序,通過搜索按鈕單擊。如何創建搜索欄來更新打字信件的搜索?類似於谷歌瀏覽器中的內容。我正在尋找答案,但我找不到它。 Tnx很多!如何創建搜索欄來更新搜索輸入

SearchableDictionary.java

package com.bogdanskoric.searchdictionary; 



import android.app.Activity; 
import android.app.SearchManager; 
import android.content.Context; 
import android.content.Intent; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Build; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ListView; 
import android.widget.SearchView; 
import android.widget.SimpleCursorAdapter; 
import android.widget.TextView; 
import android.widget.AdapterView.OnItemClickListener; 



public class SearchableDictionary extends Activity { 

    private TextView mTextView; 
    private ListView mListView; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mTextView = (TextView) findViewById(R.id.text); 
     mListView = (ListView) findViewById(R.id.list); 



     handleIntent(getIntent()); 
    } 

    @Override 
    protected void onNewIntent(Intent intent) { 

     handleIntent(intent); 
    } 

    private void handleIntent(Intent intent) { 
     if (Intent.ACTION_VIEW.equals(intent.getAction())) { 
      // handles a click on a search suggestion; launches activity to show word 
      Intent wordIntent = new Intent(this, WordActivity.class); 
      wordIntent.setData(intent.getData()); 
      startActivity(wordIntent); 
     } else if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
      // handles a search query 
      String query = intent.getStringExtra(SearchManager.QUERY); 
      showResults(query); 
     } 
    } 

    /** 
    * Searches the dictionary and displays results for the given query. 
    * @param query The search query 
    */ 
    private void showResults(String query) { 

     Cursor cursor = managedQuery(DictionaryProvider.CONTENT_URI, null, null, 
           new String[] {query}, null); 

     if (cursor == null) { 
      // There are no results 
      mTextView.setText(getString(R.string.no_results, new Object[] {query})); 
     } else { 
      // Display the number of results 
      int count = cursor.getCount(); 
      String countString = getResources().getQuantityString(R.plurals.search_results, 
            count, new Object[] {count, query}); 
      mTextView.setText(countString); 

      // Specify the columns we want to display in the result 
      String[] from = new String[] { DictionaryDatabase.KEY_WORD, 
              DictionaryDatabase.KEY_DEFINITION }; 

      // Specify the corresponding layout elements where we want the columns to go 
      int[] to = new int[] { R.id.word 
            }; 

      // Create a simple cursor adapter for the definitions and apply them to the ListView 
      SimpleCursorAdapter words = new SimpleCursorAdapter(this, 
              R.layout.result, cursor, from, to); 
      mListView.setAdapter(words); 

      // Define the on-click listener for the list items 
      mListView.setOnItemClickListener(new OnItemClickListener() { 

       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
        // Build the Intent used to open WordActivity with a specific word Uri 
        Intent wordIntent = new Intent(getApplicationContext(), WordActivity.class); 
        Uri data = Uri.withAppendedPath(DictionaryProvider.CONTENT_URI, 
                String.valueOf(id)); 
        wordIntent.setData(data); 
        startActivity(wordIntent); 
        finish(); 
       } 
      }); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.searchable_dictionary, menu); 

     if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){ 
      SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
      SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView(); 
      searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 
      searchView.setIconifiedByDefault(false); 
     } 

     return true; 
    } 

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

      default: 
       return false; 
     } 
    } 


    } 

DictionaryDatabase.java

package com.bogdanskoric.searchdictionary; 

import android.app.SearchManager; 
import android.content.ContentValues; 
import android.content.Context; 
import android.content.res.Resources; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.database.sqlite.SQLiteQueryBuilder; 
import android.provider.BaseColumns; 
import android.text.TextUtils; 
import android.util.Log; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.HashMap; 


public class DictionaryDatabase { 
    private static final String TAG = "DictionaryDatabase"; 

    //The columns we'll include in the dictionary table 
    public static final String KEY_WORD = SearchManager.SUGGEST_COLUMN_TEXT_1; 
    public static final String KEY_DEFINITION = SearchManager.SUGGEST_COLUMN_TEXT_2; 

    private static final String DATABASE_NAME = "dictionary"; 
    private static final String FTS_VIRTUAL_TABLE = "FTSdictionary"; 
    private static final int DATABASE_VERSION = 2; 

    private final DictionaryOpenHelper mDatabaseOpenHelper; 
    private static final HashMap<String,String> mColumnMap = buildColumnMap(); 

    public DictionaryDatabase(Context context) { 
     mDatabaseOpenHelper = new DictionaryOpenHelper(context); 
    } 


    private static HashMap<String,String> buildColumnMap() { 
     HashMap<String,String> map = new HashMap<String,String>(); 
     map.put(KEY_WORD, KEY_WORD); 
     map.put(KEY_DEFINITION, KEY_DEFINITION); 
     map.put(BaseColumns._ID, "rowid AS " + 
       BaseColumns._ID); 
     map.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID, "rowid AS " + 
       SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID); 
     map.put(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, "rowid AS " + 
       SearchManager.SUGGEST_COLUMN_SHORTCUT_ID); 
     return map; 
    } 


    public Cursor getWord(String rowId, String[] columns) { 
     String selection = "rowid = ?"; 
     String[] selectionArgs = new String[] {rowId}; 

     return query(selection, selectionArgs, columns); 


    } 


    public Cursor getWordMatches(String query, String[] columns) { 
     String selection = KEY_WORD + " MATCH ?"; 
     String[] selectionArgs = new String[] {query+"*"}; 

     return query(selection, selectionArgs, columns); 


    } 


    private Cursor query(String selection, String[] selectionArgs, String[] columns) { 

     SQLiteQueryBuilder builder = new SQLiteQueryBuilder(); 
     builder.setTables(FTS_VIRTUAL_TABLE); 
     builder.setProjectionMap(mColumnMap); 

     Cursor cursor = builder.query(mDatabaseOpenHelper.getReadableDatabase(), 
       columns, selection, selectionArgs, null, null, null); 

     if (cursor == null) { 
      return null; 
     } else if (!cursor.moveToFirst()) { 
      cursor.close(); 
      return null; 
     } 
     return cursor; 
    } 


    private static class DictionaryOpenHelper extends SQLiteOpenHelper { 

     private final Context mHelperContext; 
     private SQLiteDatabase mDatabase; 

     private static final String FTS_TABLE_CREATE = 
        "CREATE VIRTUAL TABLE " + FTS_VIRTUAL_TABLE + 
        " USING fts3 (" + 
        KEY_WORD + ", " + 
        KEY_DEFINITION + ");"; 

     DictionaryOpenHelper(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
      mHelperContext = context; 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      mDatabase = db; 
      mDatabase.execSQL(FTS_TABLE_CREATE); 
      loadDictionary(); 
     } 

     /** 
     * Starts a thread to load the database table with words 
     */ 
     private void loadDictionary() { 
      new Thread(new Runnable() { 
       public void run() { 
        try { 
         loadWords(); 
        } catch (IOException e) { 
         throw new RuntimeException(e); 
        } 
       } 
      }).start(); 
     } 

     private void loadWords() throws IOException { 
      Log.d(TAG, "Loading words..."); 
      final Resources resources = mHelperContext.getResources(); 
      InputStream inputStream = resources.openRawResource(R.raw.definitions); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 

      try { 
       String line; 
       while ((line = reader.readLine()) != null) { 
        String[] strings = TextUtils.split(line, "-"); 
        if (strings.length < 2) continue; 
        long id = addWord(strings[0].trim(), strings[1].trim()); 
        if (id < 0) { 
         Log.e(TAG, "unable to add word: " + strings[0].trim()); 
        } 
       } 
      } finally { 
       reader.close(); 
      } 
      Log.d(TAG, "DONE loading words."); 
     } 


     public long addWord(String word, String definition) { 
      ContentValues initialValues = new ContentValues(); 
      initialValues.put(KEY_WORD, word); 
      initialValues.put(KEY_DEFINITION, definition); 

      return mDatabase.insert(FTS_VIRTUAL_TABLE, null, initialValues); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      Log.w(TAG, "Upgrading database from version " + oldVersion + " to " 
        + newVersion + ", which will destroy all old data"); 
      db.execSQL("DROP TABLE IF EXISTS " + FTS_VIRTUAL_TABLE); 
      onCreate(db); 
    } 

} 
} 

DictionaryProvider.java

package com.bogdanskoric.searchdictionary; 

import android.app.SearchManager; 
import android.content.ContentProvider; 
import android.content.ContentResolver; 
import android.content.ContentValues; 
import android.content.UriMatcher; 
import android.database.Cursor; 
import android.net.Uri; 
import android.provider.BaseColumns; 


public class DictionaryProvider extends ContentProvider { 
    String TAG = "DictionaryProvider"; 

    public static String AUTHORITY = "com.bogdanskoric.searchdictionary.DictionaryProvider"; 
    public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/dictionary"); 

    // MIME types used for searching words or looking up a single definition 
    public static final String WORDS_MIME_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + 
                "/vnd.bogdanskoric.searchdictionary"; 
    public static final String DEFINITION_MIME_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE + 
                 "/vnd.bogdanskoric.searchdictionary"; 

    private DictionaryDatabase mDictionary; 

    // UriMatcher stuff 
    private static final int SEARCH_WORDS = 0; 
    private static final int GET_WORD = 1; 
    private static final int SEARCH_SUGGEST = 2; 
    private static final int REFRESH_SHORTCUT = 3; 
    private static final UriMatcher sURIMatcher = buildUriMatcher(); 

    /** 
    * Builds up a UriMatcher for search suggestion and shortcut refresh queries. 
    */ 
    private static UriMatcher buildUriMatcher() { 
     UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); 
     // to get definitions... 
     matcher.addURI(AUTHORITY, "dictionary", SEARCH_WORDS); 
     matcher.addURI(AUTHORITY, "dictionary/#", GET_WORD); 
     // to get suggestions... 
     matcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, SEARCH_SUGGEST); 
     matcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", SEARCH_SUGGEST); 

     matcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_SHORTCUT, REFRESH_SHORTCUT); 
     matcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_SHORTCUT + "/*", REFRESH_SHORTCUT); 
     return matcher; 
    } 

    @Override 
    public boolean onCreate() { 
     mDictionary = new DictionaryDatabase(getContext()); 
     return true; 
    } 


    @Override 
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 
         String sortOrder) { 

     // Use the UriMatcher to see what kind of query we have and format the db query accordingly 
     switch (sURIMatcher.match(uri)) { 
      case SEARCH_SUGGEST: 
       if (selectionArgs == null) { 
        throw new IllegalArgumentException(
         "selectionArgs must be provided for the Uri: " + uri); 
       } 
       return getSuggestions(selectionArgs[0]); 
      case SEARCH_WORDS: 
       if (selectionArgs == null) { 
        throw new IllegalArgumentException(
         "selectionArgs must be provided for the Uri: " + uri); 
       } 
       return search(selectionArgs[0]); 
      case GET_WORD: 
       return getWord(uri); 
      case REFRESH_SHORTCUT: 
       return refreshShortcut(uri); 
      default: 
       throw new IllegalArgumentException("Unknown Uri: " + uri); 
     } 
    } 

    private Cursor getSuggestions(String query) { 
     query = query.toLowerCase(); 
     String[] columns = new String[] { 
      BaseColumns._ID, 
      DictionaryDatabase.KEY_WORD, 
      DictionaryDatabase.KEY_DEFINITION, 
     /* SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, 
         (only if you want to refresh shortcuts) */ 
      SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID}; 

     return mDictionary.getWordMatches(query, columns); 
    } 

    private Cursor search(String query) { 
     query = query.toLowerCase(); 
     String[] columns = new String[] { 
      BaseColumns._ID, 
      DictionaryDatabase.KEY_WORD, 
      DictionaryDatabase.KEY_DEFINITION}; 

     return mDictionary.getWordMatches(query, columns); 
    } 

    private Cursor getWord(Uri uri) { 
     String rowId = uri.getLastPathSegment(); 
     String[] columns = new String[] { 
      DictionaryDatabase.KEY_WORD, 
      DictionaryDatabase.KEY_DEFINITION}; 

     return mDictionary.getWord(rowId, columns); 
    } 

    private Cursor refreshShortcut(Uri uri) { 

     String rowId = uri.getLastPathSegment(); 
     String[] columns = new String[] { 
      BaseColumns._ID, 
      DictionaryDatabase.KEY_WORD, 
      DictionaryDatabase.KEY_DEFINITION, 
      SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, 
      SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID}; 

     return mDictionary.getWord(rowId, columns); 
    } 


    @Override 
    public String getType(Uri uri) { 
     switch (sURIMatcher.match(uri)) { 
      case SEARCH_WORDS: 
       return WORDS_MIME_TYPE; 
      case GET_WORD: 
       return DEFINITION_MIME_TYPE; 
      case SEARCH_SUGGEST: 
       return SearchManager.SUGGEST_MIME_TYPE; 
      case REFRESH_SHORTCUT: 
       return SearchManager.SHORTCUT_MIME_TYPE; 
      default: 
       throw new IllegalArgumentException("Unknown URL " + uri); 
     } 
    } 


    @Override 
    public Uri insert(Uri uri, ContentValues values) { 
     throw new UnsupportedOperationException(); 
    } 

    @Override 
    public int delete(Uri uri, String selection, String[] selectionArgs) { 
     throw new UnsupportedOperationException(); 
    } 

    @Override 
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 
     throw new UnsupportedOperationException(); 
    } 

} 

searchable.xml

<?xml version="1.0" encoding="utf-8"?> 

<searchable xmlns:android ="http://schemas.android.com/apk/res/android" 
android:label="@string/search_label" 
android:hint ="@string/search_hint" 

android:searchSuggestAuthority="searchdictionary.DictionaryProvider" 
android:searchSuggestIntentAction="android.intent.action.VIEW" 
android:searchSuggestIntentData="content://searchdictionary.DictionaryProvider/dictionary" 
android:searchSuggestSelection=" ?" 
android:searchSuggestThreshold="1" 
android:includeInGlobalSearch="true" 
android:searchSettingsDescription="@string/settings_description" 
> 

</searchable> 

原料/ definition.txt

Adikcija - Podložnost nekoj štetnoj navici, najcešce, psihofiziološka zavisnost od droge ili alkohola (toksikomanija, alkoholizam). 
Adolescencija - Period prelaska iz detinjstva u zrelo doba obeležen biološkim rastom, seksualnim.. 
etc. 

回答

0

使用SearchView#setOnQueryTextListener和在OnQueryTextListenerboolean onQueryTextChange(String newText)方法執行濾波。要執行過濾,請使用Filter