SearchView无法启动搜索活动,但会打开搜索栏

时间:2015-10-18 18:32:18

标签: java android searchview

我在为我的应用程序创建搜索功能时遇到问题。我已经按照各种教程,遵循Android Docs和其他Stack Overflow答案,但没有成功。我在一个活动(ContinentActivity.java)中有每个图标,当点击工具栏时会打开一个搜索窗口。但是,键入数据不会在SearchResultsActivity中注册。它从未被创造过。这可能是因为我使用的是工具栏和菜单吗?

的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;
}

此活动菜单包含搜索图标 的 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>

1 个答案:

答案 0 :(得分:1)

您似乎缺少将SearchView与onCreateOptionsMenu()方法中的可搜索信息相关联的调用?引自培训链接http://developer.android.com/guide/topics/search/search-dialog.html

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

但是,由于您没有对搜索结果使用相同的活动,因此您不能简单地使用getComponentName(),而是使用新的ComponentName(this,SearchResultsActivity.class)