Search code examples
androidandroid-edittextmorse-code

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


Everything works fine , except for the TextView and EditText which only update at the end once the camera torch stops flashing. The program is supposed to flash in morse code(which it does)highlight the text as it get to the letter and display the current letter in morse code.

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', "-----");
}

}


Solution

  • Never use Thread.sleep when running on the main thread, this blocks any UI changes on the screen, and makes the app unresponsive to touch.

    You can instead use the Handler that comes built-in with every View in Android, something like this:

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

    Read about postDelayed here: https://developer.android.com/reference/android/view/View.html#postDelayed(java.lang.Runnable, long)