EditText 和 Text View 仅在 for 循环结束时更新一次,而不是多次更新
EditText and Text View only update once when the for loop is finished instead of multiple times
一切正常,除了 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', "-----");
}
}
在 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);
在此处了解 postDelayed
:https://developer.android.com/reference/android/view/View.html#postDelayed(java.lang.Runnable, long)
一切正常,除了 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', "-----");
}
}
在 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);
在此处了解 postDelayed
:https://developer.android.com/reference/android/view/View.html#postDelayed(java.lang.Runnable, long)