EditText и Text View обновляются только один раз, когда цикл for завершен, а не несколько раз
Все отлично работает, кроме TextView
а также EditText
который обновляется только в конце, когда факел камеры перестает мигать. Предполагается, что программа должна мигать азбукой Морзе (что и происходит), выделять текст по мере его поступления и отображать текущую букву азбукой Морзе.
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', "-----");
}
}
1 ответ
Решение
Никогда не используйте Thread.sleep
когда работает на main thread
Это блокирует любые изменения пользовательского интерфейса на экране и делает приложение не реагирующим на прикосновения.
Вместо этого вы можете использовать обработчик, который встроен в каждый View в Android, что-то вроде этого:
editText.setText("hello");
editText.postDelayed(new Runnable() {
@Override
public void run() {
editText.setText("hello again");
// schedule the next change here
}
}, 1000);
Прочитать о postDelayed
здесь: https://developer.android.com/reference/android/view/View.html