2012-10-31 9 views
8

controllato il seguente: How to have clicking the phone's search button do nothing?Android - Come disabilitare il pulsante Cerca, come implementare onSearchRequested()?

Ma non funziona per me. Qualcuno ha altri suggerimenti? Grazie. Seguendo il suggerimento di Phil che aggiorna il codice in base alla sua risposta. Mostra l'errore http://www.youtube.com/watch?v=9lekcH1JAf0&feature=youtu.be

Quindi ho creato un progetto di esempio. Ho provato questo su due telefoni diversi, Android versione 2.3.5 e 4.1, ho anche provato questo su emulatore versione 2.2. Dopo aver fatto clic sul pulsante mostra la finestra di dialogo, mostra la finestra di dialogo di avanzamento bene, e dovrebbe continuare a farlo. Ma facendo clic sul pulsante Cerca sui telefoni e sull'emulatore, la finestra di dialogo di avanzamento scompare. Ecco la lezione, e manifest segue.

Il comportamento corrente è che quando si fa clic sul pulsante di ricerca, la finestra di dialogo di avanzamento scompare. Il comportamento previsto o necessario è disattivare il pulsante di ricerca o in modo simile quando viene visualizzata la finestra di dialogo e si fa clic sul pulsante di ricerca, questo clic non fa scomparire la finestra di dialogo.

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> 

mio xml ricercabile e ': res/xml/searchable.xml secondo il riferimento fornito. Ecco come il mio searchable.xml assomiglia:

<?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

Mostraci il tuo codice, questo è il suggerimento n. – dbDev

+0

Quando dici "non funziona", vuoi dire che non vedi la registrazione o il telefono lancia ancora la ricerca? – DeeV

+0

Corretto, non vedo la registrazione senza inserire onSearchRequested() nel mio onCreate(). E la ricerca non viene avviata, ma i miei dialoghi scompaiono. –

risposta

4

EDIT

contento che il mio codice qui sotto è stato utile. Con la tua domanda aggiornato (insieme al video), ora che questa sia la risposta che cercavi: Prevent ProgressDialog from being dismissed when I click the search button (Android)

-PRE-EDIT -

Invece di chiamare onSearchRequested() da onCreate(), è necessario chiamare :

startSearch(null, false, null, false); 

Poi, per evitare che il pulsante di ricerca di utilizzare il metodo onSearchRequested(), si ignora e tornare falso:

@Override 
public boolean onSearchRequested() 
{ 
    return false; 
} 

Questa soluzione è direttamente discusso nel onSearchRequested documentation:

È possibile utilizzare questa funzione come un modo semplice per lanciare l'interfaccia utente di ricerca, in risposta a una voce di menu, pulsante di ricerca, o altri widget all'interno del vostro attività. A meno che non sia stato eliminato, chiamare questa funzione è lo stesso di chiamando startSearch (null, false, null, false), che avvia la ricerca per l'attività corrente come specificato nel manifest, vedere SearchManager.

È possibile sovrascrivere questa funzione per forzare la ricerca globale, ad es. in risposta a un tasto di ricerca dedicato, o per bloccare interamente la ricerca (per restituendo semplicemente false).

Anche il numero AndroidManifest.xml è incompleto. Devi mostrare che il tuo Activity è ricercabile. Cambia la tua MainActivity dichiarazione nel modo seguente:

<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> 

Nota che @ xml/ricercabile è un riferimento XML nel apk che definisce come cercare. Questa risorsa è discussa in dettaglio here.

+0

Grazie Phil, sento di essere (siamo) vicini. Ma ancora, l'insetto persiste. Sto facendo qualcosa di sbagliato lì? Aggiornato il codice, allegato un video. –

+0

@NomanArain Ho apportato una modifica che ritengo possa portare a risolvere il problema – Phil

+0

Non vedo cosa è cambiato. Stai indicando il link che ti viene fornito? –

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

Questo codice non ha risolto il problema. –

+0

Non riesco a riprodurre il problema. –

+0

Stai usando il codice che ho postato sopra? Hai provato questo sull'emulatore che ho menzionato? –

0

Non è possibile interrompere l'evento chiave di ricerca nella vostra attività.

è necessario interrompere l'evento chiave di ricerca nella finestra di dialogo.

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

Non so se non lo capisco? http://developer.android.com/reference /android/app/Activity.html#onSearchRequested%28%29 "È possibile sovrascrivere questa funzione per forzare la ricerca globale, ad esempio in risposta a una chiave di ricerca dedicata, o per bloccare interamente la ricerca (semplicemente restituendo false)." Cerca per onSearchRequested nella pagina sopra. –

+0

@Noman Arain, hai provato con il mio suggerimento?Si tratta di dispacciamento di keyevent. Il ProgressDialog è anche una finestra. Quindi ha keydispatching stesso. quindi è necessario interrompere la chiave di ricerca nella finestra di dialogo anziché nell'attività. – landry

Problemi correlati