假设我有一个 char 数组(mCharArray)和一个 textView(tvChar),它是整个屏幕的大小。我想要这样,当用户单击屏幕(tvChar)时,textView 会显示 charArray 中的每个字符,但是在每次迭代中它应该有 1 秒的延迟。如何做到这一点?
这是我目前的解决方案。此代码片段来自片段的 onViewCreated 部分。问题是,文本不会更新,它仅适用于 char 数组的最后一个元素。
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
tvChar = (TextView) view.findViewById(R.id.tv_char);
tvChar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// not sure how to pause after each iteration...
v.postDelayed(new Runnable() {
@Override
public void run() {
for (char element : mCharArray) {
synchronized (tvChar) {
tvChar.setText(String.valueOf(element));
tvChar.notify();
try {
tvChar.wait(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}, 1000);
}
});
}
更新:感谢所有答案,虽然当我尝试它们时没有一个真正有效,但你们帮助我给出一些直觉。
我最终在 onCreate 上添加了线程处理程序
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mCharArray = getArguments().getCharArray(SENTENCE_KEY);
}
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
this.obtainMessage();
tvChar.setText(Character.toString((char)msg.arg1));
}
};
}
在 setOnclickListener 中创建一个新线程
tvChar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
thread = new Thread(new ChangeCharThread());
thread.start();
}
});
创建一个实现可运行的内部类。
class ChangeCharThread implements Runnable{
@Override
public void run() {
Message msg = Message.obtain();
for (char ch : mCharArray){
msg.arg1 = ch;
handler.sendMessage(msg);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}