user4956079
user4956079

Reputation: 21

SearchView doesn't start Search Activity but searchbar opens

I'm having trouble creating the search feature for my application. I have followed various tutorials, followed the Android Docs, and other Stack Overflow answers with no success. I have the icon for the each in one activity (ContinentActivity.java) and when clicked the toolbar opens up a search window. However typing data does not register in the SearchResultsActivity. It is never created. Could this be because I am using a toolbar and a menu?

AndroidManifest.xml

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

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

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

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

    <activity
        android:name=".SearchResultsActivity"
        android:label="@string/app_name"
        android:launchMode="singleTop">

        <!-- to identify this activity as "searchable" -->
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />             
        </intent-filter>
        <meta-data
            android:name="android.appcompat.searchable"
            android:resource="@xml/searchable" />
    </activity>

    <activity
        android:name=".ui.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity
        android:name=".ui.locations.LocationSelectionActivity"
        android:label="@string/title_activity_location_selection"
        android:noHistory="true"
        android:parentActivityName=".ui.MainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".ui.MainActivity" />
    </activity>
    <activity
        android:name=".ui.locations.ContinentActivity"
        android:theme="@style/NoAnimationTheme"
        android:label="@string/title_activity_continent"
        android:parentActivityName=".ui.MainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".ui.MainActivity" />
    </activity>

    <!-- Children of Continent Activity. Each have search capabilities-->
    <activity
        android:name=".ui.locations.CountryActivity"
        android:theme="@style/NoAnimationTheme"
        android:label="@string/title_activity_country"
        android:parentActivityName=".ui.locations.ContinentActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".ui.locations.ContinentActivity" />
    </activity>
        <activity
            android:name=".ui.locations.StateActivity"
            android:theme="@style/NoAnimationTheme"
            android:label="@string/title_activity_state"
            android:parentActivityName=".ui.locations.CountryActivity" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".ui.locations.CountryActivity" />
        </activity>
            <activity
                android:name=".ui.locations.SurfSpotActivity"
                android:theme="@style/NoAnimationTheme"
                android:label="@string/title_activity_surf_spot"
                android:parentActivityName=".ui.locations.StateActivity" >
                <meta-data
                    android:name="android.support.PARENT_ACTIVITY"
                    android:value=".ui.locations.StateActivity" />
            </activity>
</application>

SearchResultsActivity.java

public class SearchResultsActivity extends AppCompatActivity {
public static final String TAG = "SEARCH_RESULTS_ACTIVITY";
SearchResultsAdapter mSearchResultsAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Log.v(TAG, "onCreate");
    handleIntent(getIntent());
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    Log.v(TAG, "onNewIntent");
    handleIntent(intent);
}

private void handleIntent(Intent intent) {
    Log.v(TAG, "HANDLE INTENT");
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        String query = intent.getStringExtra(SearchManager.QUERY);
        showResults(query);
    }
}

private void showResults(String query) {
    // Query your data set and show results
    // ...
    Log.v(TAG, "Searching for " + query + "...");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {

    Log.v(TAG, "onCreateOptionsMenu");
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_location, menu);

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
    searchView.setSearchableInfo( searchManager.getSearchableInfo(getComponentName()) );

    return true;
}

This activities menu has the search icon ContinentActivity.java

public class ContinentActivity extends AppCompatActivity {

private ArrayList<Continent> mContinents;
@Bind(R.id.recyclerView) RecyclerView mRecyclerView;
@Bind(R.id.toolBar) Toolbar mToolbar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_location_selection);
    ButterKnife.bind(this);

    setSupportActionBar(mToolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    LocationDataSource dataSource = new LocationDataSource(this);
    dataSource.test();
    mContinents = dataSource.readContinents();

    ContinentAdapter adapter = new ContinentAdapter(this, mContinents);
    mRecyclerView.setAdapter(adapter);

    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
    mRecyclerView.setLayoutManager(layoutManager);
    mRecyclerView.setHasFixedSize(true);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_location, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    return super.onOptionsItemSelected(item);
}
}

menu_location.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:appcompat="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/action_search"
        android:orderInCategory="200"
        android:title="@string/action_settings"
        android:icon="@drawable/ic_search_white_24dp"
        appcompat:showAsAction="always"
        appcompat:actionViewClass="android.widget.SearchView"/>

</menu>

tool_bar.xml

 <?xml version="1.0" encoding="utf-8"?>
 <android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/ColorPrimary"
    android:elevation="4dp"
    android:theme="@style/Base.ThemeOverlay.AppCompat.Dark"
    android:titleTextColor="@color/ColorText">

</android.support.v7.widget.Toolbar>

Upvotes: 0

Views: 613

Answers (1)

Antony Ng
Antony Ng

Reputation: 797

Seems you have missing call to associate SearchView with searchable info within the onCreateOptionsMenu() method? Quote from the training link http://developer.android.com/guide/topics/search/search-dialog.html

searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

But since you are not using the same activity for search result, you cannot simply use getComponentName(), but to use new ComponentName(this, SearchResultsActivity.class)

Upvotes: 1

Related Questions