4

私は単純なアプリケーションを作成していますが、EditTextフィールドに正しい情報が含まれている場合は、というボタンが必要です。 'bVoice'は500ms後に自動的に押されます。私は、次のコードでこれを行うためにハンドラを書くにはどうすればよい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(); 
     } 
    } 
} 

は、私がこれまでに(更新)持っている完全なコードです:onResumeと

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

UPDATEDテキストコードの末尾に:

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

何かを自動化するには、EditTextにTextWatcherを追加してください。 –

+0

興味深いです。どうすればそれをコード化できますか? –

+0

onTextChangedメソッドを使用します。さもなければ、あなたが欠けているのはハンドラーの真のループだと思います。あなたのコードは、500ミリ秒後にハンドラを1回だけ実行します... http://stackoverflow.com/questions/8543449/how-to-use-the-textwatcher-class-in-android –

答えて

2

edittextの入力に基づいて何かを実行する場合は、 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(); 

編集可能なクラスをインポートするには、そのクラスをクリックしてalt + Enterキーを押します。 TextWatcherでも同じことを行い、それをクリックしてalt + Enterを押します。

onTextChanged内に入力するコードは、EditTextのテキストが変更されるたびに実行されます。あなたの自動問題を解決します。

+0

これは多少混乱しています。あなたが今質問に表示されている完全なJavaファイルにコードを追加できますか?基本的には、基本的には、「テキストを開く」コマンドがEditTextフィールドに表示されたときに、自動的に「bVoice」ボタンをトリガーしたいです。 –

+0

私のasnwerを更新しました。確認してください –

+0

私はいくつかのエラー、単語 'TextWatcher'と' editable'を取得しました。あなたの更新されたコードで何かを埋める必要はありますか? –

関連する問題