4

Я создаю простое приложение, мне нужна кнопка с именем 'bVoice', которая будет автоматически нажата после 500 мс, если поле EditText содержит правильную информацию.Автоматически нажмите кнопку, если EditText верен

Как написать обработчик, чтобы сделать это в следующем коде:

//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(); 
     } 
    } 
} 

Ниже приводится полный код, который я получил до сих пор (Обновлено):

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(); 
} 

ОБНОВЛЕНО текст с onResume в нижней части кода:

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

Если вы хотите что-то автоматическое, добавьте TextWatcher в EditText –

+0

Хм, интересно. Как мне это закодировать? –

+0

Используйте метод onTextChanged. В противном случае, я думаю, что все, что вам не хватает, это цикл while в обработчике. Ваш код запускает обработчик только после 500 мс ... http://stackoverflow.com/questions/8543449/how-to-use-the-textwatcher-class-in-android –

ответ

2

Если вы хотите что-то сделать на основе ввода в edittext, то вы c ould использовать TextWatcher.

UPDATE Создать глобальную логическую переменную:

Boolean isDone=false; 

Затем внутри вашего обновления кода обработчика кода, как это:

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

     } 
    }); 

Просто добавьте этот код после AsyncTask. после

}.execute(); 

Чтобы импортировать класс Editable, нажмите на него и нажмите alt + Enter. Сделайте то же самое для TextWatcher, щелкните по нему, а затем нажмите alt + Enter.

Независимо от того, какой код вы вводите внутри onTextChanged, будет выполняться всякий раз, когда изменяется текст в EditText. РЕШАЕТ вашу автоматическую проблему.

+0

Это становится несколько запутанным, любой шанс, который вы можете добавить в код для полного java-файла, который я теперь показал в вопросе? Я просто хочу просто запускать кнопку 'bVoice' автоматически, когда текст« открытая голосовая команда »появляется в поле EditText. –

+0

Я обновил свой asnwer. Пожалуйста, проверьте –

+0

Я получаю некоторые ошибки, слово 'TextWatcher' и' editable', Нужно ли заполнять что-либо в вашем обновленном коде? –