Android: 只有创建视图层次结构的原始线程才能触及它的视图
Android: Only the original thread that created a view hierarchy can touch its views
当我在下面的代码中调用 listenButton.setAlpha((float)1)
时出现错误 "android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views"。我明白为什么,但是当我收到 onDone 事件时如何修改按钮?
public class MainActivity extends ActionBarActivity implements TextToSpeech.OnInitListener {
[...]
@Override
// OnInitListener method to receive the TTS engine status
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
ttsOK = true;
tts.setOnUtteranceProgressListener(new UtteranceProgressListener() {
@Override
public void onDone(String utteranceId) {
Button listenButton = (Button) findViewById(R.id.listentts);
listenButton.setAlpha((float)1);
listenButton.setClickable(true);
}
@Override
public void onError(String utteranceId) {
Log.d("MainActivity", "Progress on Error " + utteranceId);
}
@Override
public void onStart(String utteranceId) {
Log.d("MainActivity", "Progress on Start " + utteranceId);
}
});
}
else {
ttsOK = false;
}
}
[...]
}
试试这个:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
Button listenButton = (Button) findViewById(R.id.listentts);
listenButton.setAlpha((float)1);
listenButton.setClickable(true);
}
});
每个 View
都有一个与之关联的 Handler
,因此无需创建新的。
final View v = findViewById(R.id.listentts); // could be a class member
v.getHandler().post(new Runnable() {
@Override
public void run() {
v.setAlpha(1.0f);
v.setClickable(true);
}
});
当我在下面的代码中调用 listenButton.setAlpha((float)1)
时出现错误 "android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views"。我明白为什么,但是当我收到 onDone 事件时如何修改按钮?
public class MainActivity extends ActionBarActivity implements TextToSpeech.OnInitListener {
[...]
@Override
// OnInitListener method to receive the TTS engine status
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
ttsOK = true;
tts.setOnUtteranceProgressListener(new UtteranceProgressListener() {
@Override
public void onDone(String utteranceId) {
Button listenButton = (Button) findViewById(R.id.listentts);
listenButton.setAlpha((float)1);
listenButton.setClickable(true);
}
@Override
public void onError(String utteranceId) {
Log.d("MainActivity", "Progress on Error " + utteranceId);
}
@Override
public void onStart(String utteranceId) {
Log.d("MainActivity", "Progress on Start " + utteranceId);
}
});
}
else {
ttsOK = false;
}
}
[...]
}
试试这个:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
Button listenButton = (Button) findViewById(R.id.listentts);
listenButton.setAlpha((float)1);
listenButton.setClickable(true);
}
});
每个 View
都有一个与之关联的 Handler
,因此无需创建新的。
final View v = findViewById(R.id.listentts); // could be a class member
v.getHandler().post(new Runnable() {
@Override
public void run() {
v.setAlpha(1.0f);
v.setClickable(true);
}
});