我正在创建一个应用程序,当按钮被按下时,它会生成一些唧唧声进入"for循环",我想在循环期间阻塞按钮,并在循环结束时释放它们。
我试过了,但是应用程序崩溃了:
package android.nacho.UltraSoundSender;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class UltraSoundSender extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ultra_sound_sender);
Button btnCode = (Button) findViewById(R.id.btnCode);
btnCode.setOnClickListener(new OnClickListener() {
//@Override
public void onClick(View arg0) {
enableButton(false);
new Thread( new Runnable( )
{
public void run( )
{
//working=false;
// int Code=Integer.parseInt(((EditText)findViewById(R.id.Code)).getText().toString());
//((EditText)findViewById(R.id.Code)).setText("");
String word= ((EditText)findViewById(R.id.Code)).getText().toString();
Integer digits[]= new Integer[64];
int NumChar= word.length();
//This split the string in chars
for(int i = 0; i < NumChar ; i++){
digits[i]=(int)word.charAt(i);
}
//Values of the chirp
int startFreq = 3000;
int endFreq = 7000;
double impulseDuration = 50;
for(int IndexChar= 0; IndexChar< NumChar ; IndexChar++)
{
new ChirpGenerator().playDOWN(startFreq, endFreq, impulseDuration, digits[IndexChar]);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
enableButton(true);
}
} ).start();
}
});
}
//Enable/disable button
private void enableButton(boolean isEnable)
{
((Button)findViewById(R.id.btnCode)).setEnabled(isEnable);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_ultra_sound_sender, menu);
return true;
}
}
我在日志中得到这个错误:
06-19 11:15:00.852: E/AndroidRuntime(29419): FATAL EXCEPTION:E/AndroidRuntime(29419):android.view。ViewRootImpl$ callledfromwrongthreadeexception:只有创建视图层次结构的原始线程可以触摸它的视图。06-19 11:15:00.852: E/AndroidRuntime(29419): atandroid.view.ViewRootImpl.checkThread 06-19 (ViewRootImpl.java: 4746)11:15:00.852: E/AndroidRuntime(29419): atandroid.view.ViewRootImpl.invalidateChildInParent (ViewRootImpl.java: 854)06-19 11:15:00.852: E/AndroidRuntime(29419): atandroid.view.ViewGroup.invalidateChild 06-19 (ViewGroup.java: 4077)11:15:00.852: E/AndroidRuntime(29419): atandroid.view.View.invalidate(View.java:10322) 06-19 11:15:00.852:E/AndroidRuntime (29419):android.widget.TextView.invalidateDrawable 06-19 (TextView.java: 4601)11:15:00.852: E/AndroidRuntime(29419): atandroid.graphics.drawable.DrawableContainer.invalidateDrawable (DrawableContainer.java: 250)06-19 11:15:00.852: E/AndroidRuntime(29419): atandroid.graphics.drawable.Drawable.invalidateSelf (Drawable.java: 338)06-19 11:15:00.852: E/AndroidRuntime(29419): atandroid.graphics.drawable.Drawable.setVisible 06-19 (Drawable.java: 549)11:15:00.852: E/AndroidRuntime(29419): atandroid.graphics.drawable.DrawableContainer.selectDrawable (DrawableContainer.java: 307)06-19 11:15:00.852: E/AndroidRuntime(29419): atandroid.graphics.drawable.StateListDrawable.onStateChange (StateListDrawable.java: 106)06-19 11:15:00.852: E/AndroidRuntime(29419): atandroid.graphics.drawable.Drawable.setState 06-19 (Drawable.java: 465)11:15:00.852: E/AndroidRuntime(29419): atandroid.view.View.drawableStateChanged 06-19 (View.java: 14281)11:15:00.852: E/AndroidRuntime(29419): atandroid.widget.TextView.drawableStateChanged (TextView.java: 3184)
我应该在哪里调用enable函数?我猜是从线程中出来的,但是怎么出来的?
当按钮被点击…5秒后才能点击
btnCode.setOnClickListener(new OnClickListener()
{
public void onClick(final View v)
{
v.setClickable(false);
new Handler().postDelayed(new Runnable()
{
public void run()
{
v.setClickable(true);
}
}, 500);
}
});
用for Loop
当您在线程结束时enableButton(false)
时,您如何期望您的按钮启用?试试enableButton(true)
代替,我敢肯定这只是一个打字错误。:)
同样,在你的情况下,只有UI线程可以触摸视图,看看AsyncTask。基本上:
- 禁用
onPreExecute
中的按钮 - 在
doInBackground
做后台工作 - 启用
onPostExecute
中的按钮
你的代码需要一些重构,但它会在最后工作。
是的,可以使用setChecked函数。
您需要将按钮更改为ToggleButton
然后
btnCode.setChecked(false);
您的按钮将是可见的,但不能点击治疗后,
btnCode.setChecked(true);
尝试在 onClick
方法中将按钮的 visibility
属性设置为INVISIBLE。
btnCode.setVisibility (View.INVISIBLE);