Android:搜索建议做错了意图

时间:2014-02-14 16:51:36

标签: android android-intent android-manifest android-contentprovider android-search

我正在尝试为我的应用创建自定义建议。它运作良好,但现在我试图解决一个问题。我在AndroidManifest中设置了android:searchSuggestIntentAction="android.intent.action.VIEW"

<intent-filter>
                <action android:name="android.intent.action.VIEW" />
            </intent-filter> to Activity but even if I did this, it still sends default Intent - `ACTION_SEARCH`.

你有什么想法,问题出在哪里?

我的 AndroidManifest

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
                <provider
                    android:authorities="com.example.animalist.SuggestionProvider"
                    android:name=".SuggestionProvider" >
                </provider>
        <meta-data android:name="android.app.default_searchable"
                   android:value=".SearchActivity"/>
        <activity
            android:name="com.example.animalist.MainActivity"
            android:label="@string/app_name"
            android:launchMode="singleTop"
            android:screenOrientation="portrait" >
            <meta-data android:name="android.app.default_searchable"
                       android:value=".SearchActivity"/>

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity>

        <activity
            android:name="com.example.animalist.MoreActivity"
            android:label="@string/title_activity_more"
            android:launchMode="singleTop"
            android:parentActivityName="com.example.animalist.MainActivity"
            android:screenOrientation="portrait" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.example.animalist.MainActivity" />




        </activity>

        <activity
            android:name="com.example.animalist.SearchActivity"
            android:label="@string/title_activity_search"
            android:launchMode="singleTop"
            android:parentActivityName="com.example.animalist.MainActivity"
            android:screenOrientation="portrait" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.example.animalist.MainActivity" />


            <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>

    </application>

我的 searchable.xml

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
        android:label="@string/app_name"
        android:hint="@string/search_hint"
        android:searchSuggestAuthority="com.example.animalist.SuggestionProvider" 
        android:searchSuggestSelection=" ?"
        android:searchSuggestIntentAction="android.intent.action.VIEW"
         />

SuggestionsProvider

的一部分
public class SuggestionProvider extends SearchRecentSuggestionsProvider {
    private static final String TAG = "SuggestionProvider";

    private static final int SEARCH_SUGGESTIONS = 1;

    private static final UriMatcher sURLMatcher = new UriMatcher(
            UriMatcher.NO_MATCH);

    static {
        sURLMatcher.addURI("*", SearchManager.SUGGEST_URI_PATH_QUERY,
                SEARCH_SUGGESTIONS);
        sURLMatcher.addURI("*", SearchManager.SUGGEST_URI_PATH_QUERY + "/*",
                SEARCH_SUGGESTIONS);
    }

    private static final String[] COLUMNS = new String[] {
            "_id",
            SearchManager.SUGGEST_COLUMN_TEXT_1,
            SearchManager.SUGGEST_COLUMN_INTENT_ACTION,
            SearchManager.SUGGEST_COLUMN_QUERY,
            SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA
    };

    public SuggestionProvider() {
    }

    @Override
    public boolean onCreate() {
        return true;
    }

    @Override
    public Cursor query(Uri url, String[] projectionIn, String selection,
            String[] selectionArgs, String sort) {
        int match = sURLMatcher.match(url);
        switch (match) {
            case SEARCH_SUGGESTIONS:
                String query = url.getLastPathSegment();
                MatrixCursor cursor = new MatrixCursor(COLUMNS);

                ParseQuery<Animal> squery = ParseQuery.getQuery(Animal.class);
            try {

                List<Animal> results = squery.find();
                for (Animal animal : results) {
                        addRow(cursor,  animal.getAnimal());
            } }catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


            return cursor;}
        return null;
                }





    private void addRow(MatrixCursor cursor, String string) {
        long id = cursor.getCount();
        cursor .newRow().add(id).add(string).add(Intent.ACTION_SEARCH).add(string);
    }

    @Override
    public String getType(Uri url) {
        int match = sURLMatcher.match(url);
        switch (match) {
            case SEARCH_SUGGESTIONS:
                return SearchManager.SUGGEST_MIME_TYPE;
            default:
                throw new IllegalArgumentException("Unknown URL: " + url);
        }
    }

    @Override
    public int update(Uri url, ContentValues values, String where, String[] whereArgs) {
        throw new UnsupportedOperationException("update not supported");
    }

    @Override
    public Uri insert(Uri url, ContentValues initialValues) {
        throw new UnsupportedOperationException("insert not supported");
    }

    @Override
    public int delete(Uri url, String where, String[] whereArgs) {
        throw new UnsupportedOperationException("delete not supported");
    }
}

我的 SearchActivity

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);

        mActionBar = getSupportActionBar();
        mActionBar.setDisplayHomeAsUpEnabled(true);
        mListView = (ListView) findViewById(R.id.search_listview);
        mProgressBar = (ProgressBar) findViewById(R.id.search_loading_animals);
        Intent intent = getIntent();

        nAdapter = new SearchAdapter(SearchActivity.this, new ArrayList<Animal>());     



        mProgressBar.setVisibility(View.VISIBLE);
        mListView.setVisibility(View.VISIBLE);



        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
            String query = intent.getStringExtra("query").toString();
            Toast.makeText(getBaseContext(), "search", Toast.LENGTH_SHORT).show();

        doSearch(query);
        }

        if (Intent.ACTION_VIEW.equals(intent.getAction())) {

            Toast.makeText(getBaseContext(), "view", Toast.LENGTH_SHORT).show();
        }


        }


    public void doSearch(String query){ 
        mListView = (ListView) findViewById(R.id.search_listview);
        nAdapter = new SearchAdapter(SearchActivity.this, new ArrayList<Animal>());
        View header = getLayoutInflater().inflate(R.layout.search_header, null);
        mListView.addHeaderView(header, null , false);
        result = (TextView) header.findViewById(R.id.result);
        result.setText(" '"+query+"'");
        mListView.setDividerHeight(0);
        mListView.setAdapter(nAdapter);;
        ParseQuery<Animal> squery = ParseQuery.getQuery(Animal.class);

        squery.whereMatches("animal", query, "i");
        squery.findInBackground(new FindCallback<Animal>() {

    @Override
     public void done(List<Animal> animals, ParseException error) {


      if(animals != null){
        nAdapter.clear();

        for (int i = 0; i < animals.size(); i++) {
            mProgressBar = (ProgressBar) findViewById(R.id.search_loading_animals);
            mProgressBar.setVisibility(View.INVISIBLE);

            nAdapter.add(animals.get(i));

              }  
         }
    }
 }); } }

我对任何答案或建议都很满意。我试图在很长一段时间内解决这个问题。

提前致谢

1 个答案:

答案 0 :(得分:0)

您不需要清单上的操作视图。把它放在searchable.xml中。

SELECT a.*
FROM a
WHERE a.col1 LIKE '%Empty%' OR a.col2 LIKE '%Empty%' OR ...