Java onTouchListener一个ImageView需要单击两次才能工作,另一个只需单击一次

Java onTouchListener一个ImageView需要单击两次才能工作,另一个只需单击一次,java,android,ontouchlistener,Java,Android,Ontouchlistener,代码如下: public class MainActivity extends Activity implements OnTouchListener { RelativeLayout rl; int i, j = 0; final int imageArray[] = { R.drawable.w1, R.drawable.w2, R.drawable.w3 }; int image; final int imageCount = 3; Im

代码如下:

public class MainActivity extends Activity implements OnTouchListener {

    RelativeLayout rl;
    int i, j = 0;
    final int imageArray[] = { R.drawable.w1, R.drawable.w2, R.drawable.w3 };
    int image;
    final int imageCount = 3;

    ImageView back, save, next;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);

        final int imageArray[] = { R.drawable.w1, R.drawable.w2, R.drawable.w3 };
        image = imageArray[0];

        rl = (RelativeLayout) findViewById(R.id.rlBackground);

        back = (ImageView) findViewById(R.id.bBack);
        save = (ImageView) findViewById(R.id.bSave);
        next = (ImageView) findViewById(R.id.bNext);

        back.setOnTouchListener(this);
        save.setOnTouchListener(this);
        next.setOnTouchListener(this);

    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub

        switch (v.getId()) {
        case R.id.bBack:
            if (j == 0) {
                j = imageCount;
            }
            image = imageArray[j - 1];
            rl.setBackgroundResource(image);
            j = j - 1;
            break;
        case R.id.bSave:
            BitmapFactory.Options opts = new BitmapFactory.Options();
            opts.inSampleSize = 2;
            Bitmap bm = BitmapFactory.decodeResource(getResources(), image,
                    opts);
            // savePicture(bm, "image_name.jpg");
            SaveImage savefile = new SaveImage();
            savefile.SaveImagee(this, bm);
            Toast.makeText(getApplicationContext(),
                    "Image saved on your gallery!", Toast.LENGTH_LONG).show();
            break;

        case R.id.bNext:
            if (j != imageCount) {
                rl.setBackgroundResource(imageArray[j]);
                image = imageArray[j];
                j = j + 1;
            } else {
                j = 0;
                rl.setBackgroundResource(imageArray[j]);
                image = imageArray[j];
                j = j + 1;
            }
            break;

        }

        return false;
    }
}
问题是:如果我点击save按钮,它会在第一次点击时起作用。如果我点击下一步按钮,我需要点击它两次来触发该功能,但在那之后,如果我继续点击下一步按钮,它只需点击一次即可工作。但当我切换到button back时,需要单击两次,然后只单击一次,如果我切换回button next,同样的情况也会发生——两次,一次。。 我想这与专注有关

如果我将
ImageView
更改为
ImageButton
,它会触发函数两次,如果我添加If statemt
(event.getAction()==MotionEvent.ACTION\u DOWN)
,那么我必须再次单击按钮两次。。我想让这个按钮一直只需点击一下。我不明白为什么会发生这种情况,因为“保存”按钮始终只需单击一次即可工作

编辑:如果我更改

image = imageArray[j];


然后,一次点击按钮就可以工作了,但我还是看不到。

你真的应该使用onclick监听器

但可能是因为你没有告诉系统你已经处理了触摸事件。处理触摸事件时尝试返回true,否则返回false。例如:

 switch (v.getId()) {
    case R.id.bBack:
        if (j == 0) {
            j = imageCount;
        }
        image = imageArray[j - 1];
        rl.setBackgroundResource(image);
        j = j - 1;
        return true;
    default:
        return false;

我刚刚意识到我将ImageCount设置为3,但在数组中它从0开始计数,我在这个应用程序的开始处编程了这个值,我认为它不会错。

为什么不使用onClick Listener?“如果我将ImageView更改为ImageButton,它会触发函数两次,”如果更改为
onClick(),这是真的吗
而不是
onTouch()
?bNext的else块总是导致
j
相等
1
。这真的是你想要的吗?我一直在搞乱我的代码,所以现在可能不是。但这不是重点。请帮助我解决双击问题,而不是其他任何问题。其他一切都很好@我以前用过onClick,结果也一样。必须单击两次。我以前使用过onClick Listener,但我被告知使用onTouch来解决我的问题,现在我被告知使用onClick,问题仍然是一样的。你的回答并不能解决我的问题,同样的情况仍然存在。
 switch (v.getId()) {
    case R.id.bBack:
        if (j == 0) {
            j = imageCount;
        }
        image = imageArray[j - 1];
        rl.setBackgroundResource(image);
        j = j - 1;
        return true;
    default:
        return false;