如何在android中翻转卡片(然后返回)

时间:2014-02-18 01:55:20

标签: android android-layout

我的应用程序中有一个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期间,用户仍然可以点击! 它没有解决问题...

3 个答案:

答案 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>