2012-10-31 8 views
8

Karo heraus die folgenden: How to have clicking the phone's search button do nothing?Android - Wie Search-Taste zu deaktivieren, wie OnSearchRequested() implementieren?

Aber es für mich nicht funktioniert. Hat jemand andere Vorschläge? Vielen Dank. Nach Phils Vorschlag, den Code entsprechend seiner Antwort zu aktualisieren. Zeigt den Fehler http://www.youtube.com/watch?v=9lekcH1JAf0&feature=youtu.be

Also habe ich ein Beispielprojekt gemacht. Ich habe das auf zwei verschiedenen Handys getestet, Android Version 2.3.5 und 4.1, ich habe es auch auf Emulator Version 2.2 getestet. Nachdem ich auf den Button show dialog geklickt habe, zeigt es den Fortschrittsdialog an und sollte es auch weiterhin tun. Durch Klicken auf die Schaltfläche Suchen auf den Telefonen und im Emulator wird der Fortschrittsdialog jedoch ausgeblendet. Hier ist die Klasse, und Manifest folgt.

Das aktuelle Verhalten ist, dass beim Klicken auf die Suchschaltfläche der Fortschrittsdialog verschwindet. Das erwartete oder erforderliche Verhalten besteht darin, die Suchschaltfläche zu deaktivieren, oder ähnlich, wenn das Dialogfeld angezeigt wird und die Suchschaltfläche angeklickt wird. Durch diesen Klick wird der Dialog nicht ausgeblendet.

package com.example.test6; 

import android.os.Bundle; 
import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.util.Log; 
import android.view.KeyEvent; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 

public class MainActivity extends Activity { 

    Button showDialogButton; 
    Context context; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     showDialogButton = (Button) findViewById(R.id.showDialogButton); 
     showDialogButton.setOnClickListener(showDialog); 
     context = this; 
     startSearch(null, false, null, false); 
    } 

    private OnClickListener showDialog = new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      ProgressDialog progressDialog = new ProgressDialog(context); 
      progressDialog.show(); 
     } 
    }; 

    @Override 
    public boolean onSearchRequested() { 
     Log.d("onSearchRequested", "search key pressed"); 
     return false; 
    } 

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.test6" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="1" 
     android:targetSdkVersion="15" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".MainActivity" 
      android:label="Test6" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     <intent-filter> 
      <action android:name="android.intent.action.SEARCH" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
     <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable" /> 
     </activity> 
    </application> 

</manifest> 

Meine durchsuchbare XML ist bei: res/xml/searchable.xml entsprechend der bereitgestellten Referenz. Dies ist, wie mein searchable.xml wie folgt aussieht:

<?xml version="1.0" encoding="utf-8"?> 
<searchable xmlns:android="http://schemas.android.com/apk/res/android" 
    android:searchSuggestAuthority="dictionary" 
    android:searchSuggestIntentAction="android.intent.action.VIEW" 
    android:includeInGlobalSearch="true"> 
</searchable> 
+1

Zeigen Sie uns Ihren Code, das ist Vorschlag # 1. – dbDev

+0

Wenn Sie "Es funktioniert nicht" sagen, meinen Sie, dass Sie die Protokollierung nicht sehen oder das Telefon die Suche noch startet? – DeeV

+0

Richtig, ich sehe keine Protokollierung, ohne onSearchRequested() in my onCreate() zu setzen. Und die Suche wird nicht gestartet, aber meine Dialoge verschwinden. –

Antwort

4

EDIT

Glad meinen Code unten hilfreich war. Mit Ihrer aktualisierten Frage (zusammen mit dem Video), ich glaube, das ist jetzt die Antwort, die Sie brauchen: Prevent ProgressDialog from being dismissed when I click the search button (Android)

-PRE-EDIT -

Statt onSearchRequested() von onCreate() aufrufen, müssen Sie anrufen :

startSearch(null, false, null, false); 

Dann aus der Verwendung der onSearchRequested() Methode, um die Suchtaste, um zu verhindern, außer Kraft setzen Sie es und return false:

Diese Lösung wird direkt in den onSearchRequested documentation diskutiert:

Sie diese Funktion als eine einfache Art und Weise können Sie die Suche UI zu starten, in Reaktion auf einen Menüpunkt, Suchtaste oder anderen Widgets in Ihrem Aktivität. Wenn diese Funktion nicht überschrieben wird, entspricht das dem Aufruf von startSearch (null, false, null, false) , wodurch die Suche für die aktuelle Aktivität wie in ihrem Manifest angegeben ausgelöst wird, siehe SearchManager.

Sie können diese Funktion überschreiben, um eine globale Suche zu erzwingen, z. in Antwort auf einen dedizierten Suchschlüssel, oder die Suche vollständig zu blockieren (durch einfach falsch).

Ihre AndroidManifest.xml ist ebenfalls unvollständig. Sie müssen zeigen, dass Ihre Activity durchsuchbar ist. Ändern Sie Ihre MainActivity Erklärung wie folgt:

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

Beachten Sie, dass @ xml/durchsuchbar eine XML-Referenz in Ihrer apk ist, die definiert, wie zu suchen. Diese Ressource wird ausführlich beschrieben here.

+0

Danke Phil, ich fühle, dass ich (wir) nah bin. Aber der Fehler bleibt bestehen. Mache ich da etwas falsch? Der Code wurde aktualisiert, ein Video angehängt. –

+0

@NomanArain Ich habe eine Bearbeitung vorgenommen, von der ich denke, dass sie dich dazu bringen wird, dein Problem zu beheben. – Phil

+0

Ich sehe nicht, was sich geändert hat. Zeigen Sie auf den angegebenen Link? –

0
@Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_SEARCH) { 
      Log.d("onKeyDown", "search key pressed"); 
      // onSearchRequested(); 
      return true; // You need to return true here. This tells android that you consumed the event. 
     } 
     return false; 
    } 
+0

Dieser Code hat das Problem nicht behoben. –

+0

Ich kann Ihr Problem nicht reproduzieren. –

+0

Sie verwenden den oben angegebenen Code? Hast du das auf dem Emulator versucht, den ich erwähnt habe? –

0

Sie nicht die Suche Schlüsselereignis in Ihrer Tätigkeit unterbrechen kann.

Sie müssen das Suchschlüsselereignis in Ihrem Dialog unterbrechen.

private OnClickListener showDialog = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     ProgressDialog progressDialog = new ProgressDialog(context); 
     progressDialog.setOnKeyListener(new OnKeyListener(){ 
       public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event)  { 
       if (keyCode == KeyEvent.KEYCODE_SEARCH) { 
        Log.d("onKeyDown", "search key pressed"); 
        return true; 
       } 
       return super.onKey(dialog,keyCode,event); 
    }}); 
     progressDialog.show(); 
    } 
}; 
+0

Ich weiß nicht, ob ich das nicht verstehe? http://developer.android.com/reference /android/app/Activity.html#onSearchRequested%28%29 "Sie können diese Funktion überschreiben, um die globale Suche zu erzwingen, zB als Reaktion auf einen dedizierten Suchschlüssel, oder um die Suche vollständig zu blockieren (indem Sie einfach false zurückgeben)." Suche for onSearchAuf der obigen Seite angefordert –

+0

@Noman Arain, hast du es mit meinem Vorschlag versucht?Hier geht es um keyevent dispatching. Der ProgressDialog ist auch ein Fenster. So hat es sich selbst kidispatching. Sie sollten also den Suchschlüssel im Dialog statt in der Aktivität unterbrechen. – landry

Verwandte Themen