简体   繁体   English

按下按钮后清除 EditText 字段的内容

[英]Clear the contents of an EditText Field once button is pressed

I am creating a simple app which automatically triggers a button b once the contents of an EditText field called a contains a key phrase.我正在创建一个简单的应用程序,一旦名为aEditText字段的内容包含一个关键短语,它就会自动触发按钮b I am wanting to clear the contents of the edit text field automatically say after 2 seconds.我想在 2 秒后自动清除编辑文本字段的内容。 Is there a easy way to implement this into my code below?有没有一种简单的方法可以将其实现到我下面的代码中?

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;

Boolean isDone = false;

@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();
//line added.../////////////////////////
    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) {

        }
    });
////////////////////////////////////////
}

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

        //Go to the relevant page if any part of the phrase or word entered in the 'EditText' field contains 'command' which is not case sensitive
        if (str_1.toLowerCase().contains("command")) {
            Intent userintent = new Intent(PocketSphinxActivity.this, Gvoice.class);

            startActivity(userintent);
        } else {
            Toast.makeText(getApplicationContext(), "Incorrect Information", Toast.LENGTH_SHORT).show();
        }
    }
}

//Added this to clear the 'open voice command' text when pressing back from a activity window
//This at the moment seems to only work when typing the command, If I use speech to text to say'open voice command
@Override
public void onResume(){
    super.onResume();
    isDone = false;
    a.setText("");
}

}

Additionally, due to using a boolean method, if I go back to this activity using the back button etc in my app, it does not seem to trigger the option again.此外,由于使用了布尔方法,如果我使用应用程序中的后退按钮等返回此活动,它似乎不会再次触发该选项。 Is there a way to cause it to trigger b again if I return back to the same window/activity?如果我返回到同一个窗口/活动,有没有办法让它再次触发b

I'll really appreciate some useful help in modifying part of my code shown above.在修改上面显示的部分代码时,我将非常感谢一些有用的帮助。

For the first part, you're actually doing it already on your code.对于第一部分,您实际上已经在您的代码上这样做了。 The only thing that I don't understand is as to why do you have the boolean isDone ?我唯一不明白的是为什么你有boolean isDone Have you tried removing it?你试过删除它吗? Since if you already cleared the EditText , even if it does go through onTextChanged again, it wont pass the first condition again (Here I'm presuming that b s action is to clear the text of a ).因为如果你已经清除了EditText ,即使它经过onTextChanged再次,它不会再次通过第一个条件(在这里我假定b的行动是明确的文字a )。

For the text checking, I think you can use androids TextUtils.equals() :对于文本检查,我认为您可以使用 androids TextUtils.equals()

TextUtils.equals(s, "open voice command");

EDIT编辑

Okay.好的。 So I re-analyzed your post and your comments and ended up with this flow of behavior.所以我重新分析了你的帖子和你的评论,最终得出了这种行为流。

The First time the activity runs, when you type in "open voice command" in EditText a , Button b will be automatically clicked and will proceed to starting an activity and MUST clear EditText a .活动第一次运行时,当您在EditText a输入“打开语音命令”时, Button b将被自动单击并继续启动活动,并且必须清除EditText a Pressing back to the activity that contains both EditText a and Button b , you want the EditText a onTextChangeListener to still function.回到同时包含EditText aButton b ,您希望EditText a onTextChangeListener仍然起作用。

With those in mind, I ended up modifying your code as below:考虑到这些,我最终修改了您的代码,如下所示:

public class MainActivity extends AppCompatActivity {

    EditText a;
    Button b;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Initialize Views
        a = (EditText) findViewById(R.id.a);
        b = (Button) findViewById(R.id.b);

        // Initialize listeners
        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 (TextUtils.equals(s, "open voice command")) {
                    Log.d("SAMPLE", ">>>>>>> Running handler!....");
                    Handler handler = new Handler();
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            a.setText(null);
                            b.performClick();
                        }
                    }, 500);
                }

            }

            @Override
            public void afterTextChanged(Editable s) {
            }
        });

        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SampleActivity.class);
                startActivity(intent);
            }
        });

    }

}

When I type in "open voice command" in EditText a , is automatically gets cleared and calls the performClick() for Button b .当我在EditText a输入“打开语音命令”时,它会自动被清除并为Button b调用performClick() After I get back to the activity.在我回到活动之后。 Nothing happens, the handler doesn't run since the text value of EditText a is empty.没有任何反应,处理程序不会运行,因为EditText a的文本值为空。 The handler will only trigger again if you type in "open voice command".如果您输入“打开语音命令”,处理程序只会再次触发。

EDIT 2编辑 2

Here is the code I am running.这是我正在运行的代码。 I just commented out most of the codes that are not related to the concern on your post.我只是注释掉了大部分与您帖子中关注的问题无关的代码。 I'm getting the correct behavior you are aiming for.我得到了你想要的正确行为。

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.speech.RecognitionListener;
import android.speech.SpeechRecognizer;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;

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;

    Boolean isDone = false;

    @Override
    public void onCreate(Bundle state) {
        super.onCreate(state);
        setContentView(R.layout.activity_main);

        // Prepare the data for UI
//        captions = new HashMap<String, Integer>();
//        captions.put(KWS_SEARCH, R.string.kws_caption);
//        ((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.a);
        b = (Button) findViewById(R.id.b);
//        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();
//line added.../////////////////////////
        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) {

            }
        });
////////////////////////////////////////
    }

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

    /**
     * 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.b) {
            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 'command' which is not case sensitive
            if (str_1.toLowerCase().contains("command")) {
                Intent userintent = new Intent(PocketSphinxActivity.this, Gvoice.class);
                startActivity(userintent);
            } else {
                Toast.makeText(getApplicationContext(), "Incorrect Information", Toast.LENGTH_SHORT).show();
            }
        }
    }

    //Added this to clear the 'open voice command' text when pressing back from a activity window
    //This at the moment seems to only work when typing the command, If I use speech to text to say'open voice command
    @Override
    public void onResume() {
        super.onResume();
        isDone = false;
        a.setText("");
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM