2015-10-18 66 views
0

我無法爲我的應用程序創建搜索功能。我遵循各種教程,遵循Android Docs和其他Stack Overflow解決方案,但沒有成功。我在一個活動(ContinentActivity.java)中有每個圖標,當點擊時,工具欄打開一個搜索窗口。但是,鍵入數據不會在SearchResultsActivity中註冊。它從未被創造。這可能是因爲我正在使用工具欄和菜單嗎?SearchView未啓動搜索活動,但搜索欄打開

的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

硒ems你有沒有調用關聯SearchView與onCreateOptionsMenu()方法內的可搜索信息?來自培訓鏈接的報價http://developer.android.com/guide/topics/search/search-dialog.html

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

但是由於您沒有對搜索結果使用相同的活動,因此您不能簡單地使用getComponentName(),而是使用新的ComponentName(這是SearchResultsActivity.class)