2016-07-31 20 views
6

Ich versuche, das Tutorial zum Einrichten einer Suche hier erklärt: https://developer.android.com/training/search/setup.htmlAndroid - Suche nicht geöffnet Aktivität

Ich habe ein Menü mit einer Suche erstellt & die Suche konfiguriert. Meine SearchResultActivity wird jedoch nicht geöffnet, wenn ich auf die Schaltfläche "Suchen" auf der Tastatur oder auf die Schaltfläche "Senden" von SearchView klicke.

Ich habe auch versucht, Search widget on action bar doesn't trigger my search activity zu folgen, aber ich bin nicht in der Lage, das SearchView zu öffnen, die zweite Aktivität. Könnte jemand bitte helfen?

Hier ist mein Menü:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context="com.sample.searchbarapplication.MainActivity"> 
    <item 
     android:id="@+id/action_search" 
     android:orderInCategory="100" 
     android:title="@string/action_search" 
     android:icon="@drawable/ic_search_white_24dp" 
     app:actionViewClass="android.support.v7.widget.SearchView" 
     app:showAsAction="collapseActionView|ifRoom" /> 
</menu> 

Die Suche-Konfiguration xml:

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

<searchable xmlns:android="http://schemas.android.com/apk/res/android" 
    android:label="@string/app_name" 
    android:hint="@string/search_hint" /> 

Manifest:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.sample.searchbarapplication"> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 

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

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

      <meta-data 
       android:name="android.app.searchable" 
       android:resource="@xml/searchable" /> 

     </activity> 

     <activity android:name=".SearchResultActivity" 
      android:launchMode="singleTop"> 

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

     </activity> 

    </application> 

</manifest> 

MainActivity die die Suche in seiner Symbolleiste hat:

public class MainActivity extends AppCompatActivity { 
ActionMenuView mActionMenuView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 

    setSupportActionBar(toolbar); 
    getSupportActionBar().setTitle(null); 
} 

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

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

    searchView.setIconifiedByDefault(false); 
    searchView.setSubmitButtonEnabled (true); 

    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 
    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_search) { 
     Log.v("click","click"); 
    } 

    return true; 
} 
} 

Und SearchResultActivity.java:

public class SearchResultActivity extends AppCompatActivity { 

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

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

    private void handleIntent(Intent intent) { 
     Log.v("query2","query"); 
     if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
      String query = intent.getStringExtra(SearchManager.QUERY); 
      //use the query to search your data somehow 
      Log.v("query",query.toString()); 
     } 
    } 
} 

Bearbeiten - Hier ist mein Layout-Datei für MainActivity, die die Suche enthält. Der Inhalt des include-Tags ist ein (leerer) RelativeLayout ohne untergeordnete Ansichten.

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:context="com.sample.searchbarapplication.MainActivity"> 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/AppTheme.AppBarOverlay"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="?attr/colorPrimary" 
      app:popupTheme="@style/AppTheme.PopupOverlay" > 

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

    </android.support.design.widget.AppBarLayout> 

    <include layout="@layout/content_main" /> 

</android.support.design.widget.CoordinatorLayout> 

Edit 2: Wenn ich

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

in den Tag-MainActivity bringe, wird die MainActivity lauched wieder auf der Suche (wenn die Suchtaste auf der Tastatur oder das Ergebnis Schaltfläche Suche in der Symbolleiste gedrückt). Aber ich möchte eine neue Aktivität starten, die nicht MainActivity ist. Ist das möglich ?

Mein neues Manifest sieht wie folgt aus (die extra Intent-Filter in MainActivty des Tags bemerken):

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.sample.searchbarapplication"> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <meta-data 
      android:name="android.app.default_searchable" 
      android:value=".MainActivity" /> 

     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme.NoActionBar"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

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

      <meta-data 
       android:name="android.app.searchable" 
       android:resource="@xml/searchable" /> 

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

     </activity> 

     <activity android:name=".SearchResultActivity"> 

     </activity> 

    </application> 

</manifest> 

Antwort

0

Dies scheint ein weit verbreitetes Missverständnis zu sein, habe ich auch dieses Problem zum ersten Mal hatte ich eine neue Tätigkeit wollte die Suchergebnisse.

Nach erneuter Prüfung der Dokumentation here, erkannte ich, dass die "SearchableActivity" ist eigentlich diejenige, die die Ergebnisse anzeigen wird.

So werden Sie dies für die MainActivity ändern müssen:

<activity 
     android:name=".MainActivity" 
     android:theme="@style/AppTheme.NoActionBar"> 
     <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> 

Dies ist für die SearchResultActivity:

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

     <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable" /> 
</activity> 

So zusammengefasst, die "android.app.default_searchable" Meta-Tag muss sein innerhalb der Aktivität, die die Suche startet. Und die Aktivität Anzeige die Suche benötigt den Intent-Filter und die Metadaten für durchsuchbar.