EditText 和 Text View 仅在 for 循环结束时更新一次,而不是多次更新

EditText and Text View only update once when the for loop is finished instead of multiple times

一切正常,除了 TextViewEditText 只有在相机手电筒停止闪烁后才会在最后更新。该程序应该以莫尔斯电码闪烁(它确实如此)在到达字母时突出显示文本并以莫尔斯电码显示当前字母。

public class TextFlashActivity extends AppCompatActivity {

private TextView textView;
private String morseString;
private String text;
private String iLearnedWhatImmutableMeans;
private EditText editText;
public static HashMap morseCode;
public static Camera cam = null;
public static Camera.Parameters parameters = null;
public static Boolean isLightOn = false;
private Button button;

@Override
protected void onCreate( Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.text_flash_layout);
    init();
    button = (Button) findViewById(R.id.Button_flash);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            morseTextFlash();
        }
    });
}

@Override
protected void onPause() {
    super.onPause();
    cam.release();
}


private void morseTextFlash() {

    text = editText.getText().toString();
    Spannable WordtoSpan = new SpannableString(text);
    iLearnedWhatImmutableMeans = text.toLowerCase();
    for (int i = 0; i < text.length(); i++) {
        WordtoSpan.setSpan(new ForegroundColorSpan(Color.RED), 0, i + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        editText.setText(WordtoSpan);
        textView.setText((String) morseCode.get(iLearnedWhatImmutableMeans.charAt(i)));
        if (iLearnedWhatImmutableMeans.charAt(i) != ' ')
            morseString = (String) morseCode.get(iLearnedWhatImmutableMeans.charAt(i));
        for (int j = 0; j < morseString.length(); j++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (morseString.charAt(j) == '.') {
                try {
                    flashSwitch();
                    Thread.sleep(100);
                    flashSwitch();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } else {
                try {
                    flashSwitch();
                    Thread.sleep(400);
                    flashSwitch();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

private void init() {
    textView = (TextView) findViewById(R.id.TV_flash);
    editText = (EditText) findViewById(R.id.ET_flash);
    cam = Camera.open();
    parameters = cam.getParameters();
    cam.startPreview();
    hashMapInit();
}


private void flashSwitch() {
    if (isLightOn) {
        parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
        cam.setParameters(parameters);
        isLightOn = false;
    } else {
        parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
        cam.setParameters(parameters);
        isLightOn = true;
    }
}


private void hashMapInit() {
    morseCode = new HashMap<Character, String>();
    morseCode.put('a', ".-");
    morseCode.put('b', "-...");
    morseCode.put('c', "-.-");
    morseCode.put('d', "-..");
    morseCode.put('e', ".");
    morseCode.put('f', "..-.");
    morseCode.put('g', "--.");
    morseCode.put('h', "....");
    morseCode.put('i', "..");
    morseCode.put('j', ".---");
    morseCode.put('k', "-.");
    morseCode.put('l', ".-..");
    morseCode.put('m', "--");
    morseCode.put('n', "-.");
    morseCode.put('o', "---");
    morseCode.put('p', ".--.");
    morseCode.put('q', "--.-");
    morseCode.put('r', ".-.");
    morseCode.put('s', "...");
    morseCode.put('t', "-");
    morseCode.put('u', "..-");
    morseCode.put('v', "...-");
    morseCode.put('w', ".--");
    morseCode.put('x', "-..-");
    morseCode.put('y', "-.--");
    morseCode.put('z', "--..");
    morseCode.put('1', ".----");
    morseCode.put('2', "..---");
    morseCode.put('3', "...--");
    morseCode.put('4', "....-");
    morseCode.put('5', ".....");
    morseCode.put('6', "-....");
    morseCode.put('7', "--...");
    morseCode.put('8', "---..");
    morseCode.put('9', "----.");
    morseCode.put('0', "-----");
}

}

main thread 上 运行 时切勿使用 Thread.sleep,这会阻止屏幕上的任何 UI 更改,并使应用程序无法响应触摸。

您可以改为使用 Android 中每个视图内置的 Handler,如下所示:

editText.setText("hello");
editText.postDelayed(new Runnable() {
        @Override
        public void run() {
            editText.setText("hello again");
            // schedule the next change here
        }
}, 1000);

在此处了解 postDelayedhttps://developer.android.com/reference/android/view/View.html#postDelayed(java.lang.Runnable, long)