rubsnick
rubsnick

Reputation: 61

Android Search Intent not Firing What am I doing wrong?

Ok I'm incredibly frustrated I've been trying to get a SearchView to work for hours now with no luck. I checked out how to handle this and I found a sample project and the sample project works great. I then implement the same exact things in my project and bam I'm screwed. The intent won't fire. I don't understand why. I followed this

I have all my activities in an activity folder but removed the Search and Main one to see if that was the case... it's not. In my Search Results activity I'm handling the intent. It looks like this currently.

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

        // get the action bar
        ActionBar actionBar = getActionBar();

        // Enabling Back navigation on Action Bar icon
        actionBar.setDisplayHomeAsUpEnabled(true);

        txtQuery = (TextView) findViewById(R.id.txtQuery);

        handleIntent(getIntent());
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.search_result, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        setIntent(intent);
        handleIntent(intent);
    }

    /**
     * Handling intent data
     */
    private void handleIntent(Intent intent) {
        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {

            String query = intent.getStringExtra(SearchManager.QUERY);

            txtQuery.setText("Search Query: " + query);

        }

    }    

My Searchable XML looks like this.

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
            android:hint="@string/search_hint"
            android:label="@string/app_name" />

For some reason the search hint is not appearing, Yet the string resource shows up and it's declared.

my options menu looks like this

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/search"
        android:title="Search"
        android:icon="@android:drawable/ic_search_category_default"
        android:showAsAction="collapseActionView|ifRoom"
        android:actionViewClass="android.widget.SearchView" />
    <item android:id="@+id/Menu"
        android:title="MENU"
        android:showAsAction="collapseActionView|ifRoom"
        />

And my Manifest looks like this.

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/MyTheme" >

        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
             >
            <meta-data
                android:name="android.app.searchable"
                android:resource="@xml/searchable" />
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".activities.MenuActivity"
            android:label="@string/title_activity_menu"
            android:theme="@style/IDME.Theme.Transparent" >

        </activity>
        <activity
            android:name=".activities.CategoriesActivity"
            android:label="@string/title_activity_categories" >
        </activity>

        <activity
            android:name=".SearchResultActivity"
            android:label="@string/title_activity_search_result"
           >
            <intent-filter>
                <action android:name="android.intent.action.SEARCH" />
            </intent-filter>

        </activity>
    </application>
    </menu>

And my Search View inflator looks like this.

 @Override
        public boolean onCreateOptionsMenu(Menu menu)
        {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.options_menu, menu);
            SearchManager searchManager =
                    (SearchManager) getSystemService(Context.SEARCH_SERVICE);
            SearchView searchView =
                    (SearchView) menu.findItem(R.id.search).getActionView();
            searchView.setSearchableInfo(
                    searchManager.getSearchableInfo(getComponentName()));

            return  true;
        }

I cannot for the life of me figure out what's going on, I followed both guides to a tee, I cannot see what's wrong. I've messed around with metadata and I just really can't see the problem anymore. I'm stuck

Upvotes: 2

Views: 769

Answers (2)

Rushikumar
Rushikumar

Reputation: 1812

I, too, followed the exact same (official Android) guide Setting Up the Search Interface and was in the same boat as the OP @rubsnick.

Turns out, all that that needs to be tweaked is--

Change

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
         >
        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable" />
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

To

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <meta-data
            android:name="android.app.default_searchable"
            android:value=".SearchResultActivity" />
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

Notice the <meta-data code! (specifically, android:name)

Also, no need to specify the searchable xml resource here... instead, do that in the SearchResultActivity activity, as shown below...

Lastly, Modify <activity for SearchResultActivity, like so:

    <activity
        android:name=".SearchResultActivity"
        android:label="@string/title_activity_search_result" >
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>
        <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" />
    </activity>

The following SO thread does full justice as to why default_searchable and not searchable:

What's the difference between android.app.default_searchable and android.app.searchable meta-data?

Upvotes: 2

mmlooloo
mmlooloo

Reputation: 18977

your meta data is incorrect you must use:

<meta-data
  android:name="android.app.searchable"
  android:resource="@xml/searchable"
  android:value="your package name of searchable activity.SearchResultActivity" />

Upvotes: 1

Related Questions