我的应用程序中有一个ImageButton。
<ImageButton
android:id="@+id/imageButton1"
android:layout_width="80dp"
android:layout_height="80dp"
android:clickable="true"
android:src="@drawable/button" />
我将它绑定到onClickListener:
View.OnClickListener imgButtonHandler = new View.OnClickListener() {
public void onClick(View v) {
// Here I update the image source to a different image.
}
};
现在发生的事情是:当我点击图像按钮时,图像按钮变为a 不同的形象。但我想让它在0.5秒后自动改回(在此期间) 同时用户不应该点击任何东西)。我如何能 实现那个?我试着在监听器中的onClick函数中睡觉,但它是 不工作......
新修改:
如果我只有一个图像按钮,建议的答案将解决我的问题。我试了一下 并且都像魅力一样工作!
实际上它没有按预期工作。在那500ms期间,用户仍然可以点击! 它没有解决问题...
答案 0 :(得分:2)
发布延迟的runnable可能会完成这项任务。
public void onClick(View v) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// change the background of the image button
(ImageButton)v.setBackgroundResource(R.drawable.someimage);
}
}, 500);
}
事实上,我已经在具有两个ImageButton的实际设备上运行了以下代码,并且它工作正常。
顺便说一句,如果您希望按钮在500毫秒内无法点击,只需将其设置为imgBtn1.setClickable(false);
并将其设置为可在运行中点击imgBtn1.setClickable(true);
public class TestFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.test_layout, container, false);
final ImageButton imgBtn1 = (ImageButton) view.findViewById(R.id.test_img_btn1);
final ImageButton imgBtn2 = (ImageButton) view.findViewById(R.id.test_img_btn2);
imgBtn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
imgBtn1.setBackgroundResource(R.drawable.device_type_apple);
imgBtn1.setClickable(false);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// change the background of the image button
imgBtn1.setBackgroundResource(R.drawable.device_type_windows);
imgBtn1.setClickable(true);
}
}, 500);
}
});
imgBtn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
imgBtn2.setBackgroundResource(R.drawable.device_type_apple);
imgBtn2.setClickable(false);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// change the background of the image button
imgBtn2.setBackgroundResource(R.drawable.device_type_android);
imgBtn2.setClickable(true);
}
}, 500);
}
});
return view;
}
}
答案 1 :(得分:1)
您可以使用带有runnable的句柄来自动更新图像
Handler mHandler = new Handler();
Runnable mUpdateTimer = new Runnable() {
@Override
public void run() {
// code update image here
// auto update after 0.5s
mHandler.postDelayed(mUpdateTimer, 500);
}
};
单击图像按钮时:
View.OnClickListener imgButtonHandler = new View.OnClickListener() {
public void onClick(View v) {
mHandler.postDelayed(mUpdateTimer, 500);
}
};
答案 2 :(得分:0)
Handler.postDelayed
此方法效果不佳,请参阅http://developer.android.com/reference/android/os/Handler.html#postDelayed(java.lang.Runnable,long) 它说
Returns true if the Runnable was successfully placed in to the message queue. Returns false on failure, usually because the looper processing the message queue is exiting. Note that a result of true does not mean the Runnable will be processed -- if the looper is quit before the delivery time of the message occurs then the message will be dropped.
所以这个mehed可能永远不会调用,它可能会使你的图像按钮状态永远不会回来,所以你必须要关心返回值或使用其他小部件ViewFliper,它可以在图像切换时设置动画并且你可以设置delpoy。 / p>