4

Ich erstelle eine einfache App, ich benötige eine Schaltfläche mit dem Namen 'bVoice' wird automatisch nach 500ms gedrückt, wenn das EditText-Feld die richtigen Informationen enthält.Automatisch auf Schaltfläche klicken, wenn EditText korrekt ist

Wie schreibe ich den Handler dies im folgenden Code zu tun:

//Assign button clicks to got to a new activity: 
public void onButtonClick_1(View v){ 
    if (v.getId() == R.id.bVoice){ 
     String str_1 = a.getText().toString(); 

     //Go to the relevant page if any part of the phrase or word entered in the 'EditText' field contains 'next' which is not case sensitive 
     if (str_1.toLowerCase().contains("command")) { 
      Intent userintent = new Intent(PocketSphinxActivity.this, Display_1.class); 
      startActivity(userintent); 
     } else { 
      Toast.makeText(getApplicationContext(), "Incorrect Information", Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

Unterhalb der vollständige Code ist die ich bisher bekommen haben (Aktualisiert):

public class PocketSphinxActivity extends Activity implements RecognitionListener 
{ 

private static final String KWS_SEARCH = "wakeup"; 

/* Keyword we are looking for to activate menu */ 
private static final String KEYPHRASE = "open voice command"; //adjust this keyphrase! 

private SpeechRecognizer recognizer; 
private HashMap<String, Integer> captions; 

ListView lv; 
TextView tv; 
EditText a; 
Button b; 
Button c; 

@Override 
public void onCreate(Bundle state) { 
    super.onCreate(state); 

    // Prepare the data for UI 
    captions = new HashMap<String, Integer>(); 
    captions.put(KWS_SEARCH, R.string.kws_caption); 
    setContentView(R.layout.main); 
    ((TextView) findViewById(R.id.caption_text)) 
      .setText("Preparing the recognizer"); 

    lv = (ListView) findViewById(R.id.lvVoiceReturn); 
    tv = (TextView) findViewById(R.id.result_text); 
    a = (EditText) findViewById(R.id.TFusername); 
    b = (Button) findViewById(R.id.bVoice); 
    c = (Button)findViewById(R.id.Blogin); 

    // Recognizer initialization is a time-consuming and it involves IO, 
    // so we execute it in async task 

    new AsyncTask<Void, Void, Exception>() { 
     @Override 
     protected Exception doInBackground(Void... params) { 
      try { 
       Assets assets = new Assets(PocketSphinxActivity.this); 
       File assetDir = assets.syncAssets(); 
       setupRecognizer(assetDir); 
      } catch (IOException e) { 
       return e; 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Exception result) { 
      if (result != null) { 
       ((TextView) findViewById(R.id.caption_text)) 
         .setText("Failed to init recognizer " + result); 
      } else { 
       switchSearch(KWS_SEARCH); 
      } 
     } 
    }.execute(); 
    a.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      if (s.toString().trim().equalsIgnoreCase("open voice command")) { 
       // 
       //Do your stuff here OR button.performClick() 
       // 

       //DELAY 
       Handler handler = new Handler(); 
       handler.postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         b.performClick(); 
        } 
       }, 500); 
      } 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 

     } 
    }); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    recognizer.cancel(); 
    recognizer.shutdown(); 
} 

/** 
* In partial result we get quick updates about current hypothesis. In 
* keyword spotting mode we can react here, in other modes we need to wait 
* for final result in onResult. 
*/ 
@Override 
public void onPartialResult(Hypothesis hypothesis) { 
    if (hypothesis == null) 
     return; 

    String text = hypothesis.getHypstr(); 
    //((TextView) findViewById(R.id.result_text)).setText(text); 
    ((EditText) findViewById(R.id.TFusername)).setText(text); 
} 

/** 
* This callback is called when we stop the recognizer. 
*/ 
@Override 
public void onResult(Hypothesis hypothesis) { 
    //((TextView) findViewById(R.id.result_text)).setText(""); 
    ((EditText) findViewById(R.id.TFusername)).setText(""); 
    if (hypothesis != null) { 
     String text = hypothesis.getHypstr(); 
     makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show(); 


    //a.setText((String) tv.getText()); 
     //tv = TextView.getText().toString(); 
    } 
} 

@Override 
public void onBeginningOfSpeech() { 
} 

/** 
* We stop recognizer here to get a final result 
*/ 
@Override 
public void onEndOfSpeech() { 
    if (!recognizer.getSearchName().equals(KWS_SEARCH)) 
     switchSearch(KWS_SEARCH); 
} 

private void switchSearch(String searchName) { 
    recognizer.stop(); 

    // If we are not spotting, start listening with timeout (10000 ms or 10 seconds). 
    if (searchName.equals(KWS_SEARCH)) 
     recognizer.startListening(searchName); 
    else 
     recognizer.startListening(searchName, 10000); 

    String caption = getResources().getString(captions.get(searchName)); 
    ((TextView) findViewById(R.id.caption_text)).setText(caption); 
} 

private void setupRecognizer(File assetsDir) throws IOException { 
    // The recognizer can be configured to perform multiple searches 
    // of different kind and switch between them 

    recognizer = defaultSetup() 
      .setAcousticModel(new File(assetsDir, "en-us-ptm")) 
      .setDictionary(new File(assetsDir, "cmudict-en-us.dict")) 

        // To disable logging of raw audio comment out this call (takes a lot of space on the device) 
      .setRawLogDir(assetsDir) 

        // Threshold to tune for keyphrase to balance between false alarms and misses 
      .setKeywordThreshold(1e-45f) 

        // Use context-independent phonetic search, context-dependent is too slow for mobile 
      .setBoolean("-allphone_ci", true) 

      .getRecognizer(); 
    recognizer.addListener(this); 

    /** In your application you might not need to add all those searches. 
    * They are added here for demonstration. You can leave just one. 
    */ 

    // Create keyword-activation search. 
    recognizer.addKeyphraseSearch(KWS_SEARCH, KEYPHRASE); 

} 

@Override 
public void onError(Exception error) { 
    ((TextView) findViewById(R.id.caption_text)).setText(error.getMessage()); 
} 

@Override 
public void onTimeout() { 
    switchSearch(KWS_SEARCH); 
} 

//Assign button clicks to go to a new activity: 
public void onButtonClick_1(View v){ 
    if (v.getId() == R.id.bVoice){ 
     String str_1 = a.getText().toString(); 
} 

AKTUALISIERT Text mit onResume am unteren Ende des Codes:

@Override 
public void onResume(){ 
    super.onResume(); 
    isDone = false; 
    a.setText(""); 
} 
+2

Wenn Sie etwas automatisch möchten, fügen Sie einen TextWatcher zum EditText –

+0

Hmm, interessant. Wie würde ich das programmieren? –

+0

Verwenden Sie die onTextChanged-Methode. Ansonsten denke ich, alles was du verpasst hast ist eine wahrhaft echte Schleife im Handler. Ihr Code führt den Handler nur einmal nach 500ms aus ... http://stackoverflow.com/questions/8543449/how-to-use-the-textwatcher-class-in-android –

Antwort

2

Wenn Sie etwas auf der Grundlage der Eingabe im Editiertext tun möchten, dann c könnte einen TextWatcher verwenden.

UPDATE Erstellen Sie eine globale Variable boolean:

Boolean isDone=false; 

Dann in Ihrem Update-Handler-Code der Code wie folgt:

a.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      if (s.toString().trim().equalsIgnoreCase("open voice command")) 
      { 
       // 
       //Do your stuff here OR button.performClick() 
       // 

       //DELAY 
       Handler handler = new Handler(); 
       handler.postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         if (!isDone){ 
          b.performClick(); 
          isDone=true; 
         }      } 
       }, 500); 
      } 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 

     } 
    }); 

einfach diesen Code hinzufügen nach dem AsyncTask. das heißt nach

}.execute(); 

Um die Editierbare Klasse zu importieren, klicken Sie darauf und drücken Sie Alt + Enter. Machen Sie dasselbe für TextWatcher, klicken Sie darauf und drücken Sie Alt + Enter.

Der Code, den Sie in onTextChanged eingeben, wird immer dann ausgeführt, wenn sich der Text im EditText ändert. Löst Ihr automatisches Problem.

+0

Dies wird etwas verwirrend, jede Chance, die Sie in den Code zu der vollständigen Java-Datei hinzufügen können, die ich jetzt in der Frage gezeigt habe? Ich möchte nur im Grunde die "bVoice" -Taste automatisch auslösen, wenn der Text "Sprachbefehl öffnen" im EditText-Feld erscheint –

+0

Ich habe meine Asnwer aktualisiert. Bitte überprüfen Sie –

+0

Ich bekomme einige Fehler, das Wort 'TextWatcher' und' bearbeitbar', muss ich etwas in Ihrem aktualisierten Code füllen? –