Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 我有两个View.ontouch侦听器,但只有一个可用_Android_Ontouchlistener - Fatal编程技术网

Android 我有两个View.ontouch侦听器,但只有一个可用

Android 我有两个View.ontouch侦听器,但只有一个可用,android,ontouchlistener,Android,Ontouchlistener,我的代码中有两个OnTouchListener,每次运行它时——即使我更改了侦听器的名称——它都不起作用 //here is one public boolean onTouch(View view, MotionEvent event){ // this is for being able to move a spawned image with no id and id not on the activity till created final int X = (int)

我的代码中有两个OnTouchListener,每次运行它时——即使我更改了侦听器的名称——它都不起作用

//here is one
public boolean onTouch(View view, MotionEvent event){

    // this is for being able to move a spawned image with no id and id not on the activity till created
    final int X = (int) event.getRawX();
    final int Y = (int) event.getRawY();

    switch (event.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:
            RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
            _xDelta = X - lParams.leftMargin;
            _yDelta = Y - lParams.topMargin;
            break;
        case MotionEvent.ACTION_UP:
            break;
        case MotionEvent.ACTION_POINTER_DOWN:
            break;
        case MotionEvent.ACTION_POINTER_UP:
            break;
        case MotionEvent.ACTION_MOVE:
            if (no == 1) ;
                //do nothing
            else {
                RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
                layoutParams.leftMargin = X - _xDelta;
                layoutParams.topMargin = Y - _yDelta;
                layoutParams.rightMargin = -250;
                layoutParams.bottomMargin = -250;
                view.setLayoutParams(layoutParams);
                break;
            }
            _root.invalidate();
            return true;

    }
    return true;

}


@Override
public void onBackPressed() {
    new AlertDialog.Builder(this)
            .setIcon(android.R.drawable.ic_dialog_alert)
            .setTitle("             exit")
            .setMessage("Are you sure you want to exit?." +
                    "your progress will not be saved")
            .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    finish();
                    startActivity(new Intent(getApplicationContext(), level.class));

                }

            })
            .setNegativeButton("No", null)
            .show();
}

Button left, right;
ImageView i1, pic2;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_level1_game);

    _root = (ViewGroup) findViewById(R.id.root);
    addnumbers = new TextView(this);
    addnumbers.setText(Integer.toString(number));
    _root.addView(addnumbers);

    left = (Button) findViewById(R.id.button1);
    right = (Button) findViewById(R.id.button2);
    left.setOnTouchListener(this);
    right.setOnTouchListener(this);

    i1 = (ImageView) findViewById(R.id.imageView2);

    findViewById(R.id.button2).setVisibility(View.INVISIBLE);
    findViewById(R.id.button1).setVisibility(View.INVISIBLE);
    findViewById(R.id.button3).setVisibility(View.INVISIBLE);
    findViewById(R.id.button4).setVisibility(View.INVISIBLE);
    findViewById(R.id.imageView2).setVisibility(View.INVISIBLE);


}
这是第二个,它是在屏幕上移动一个字符

public boolean onTouch1(View v, MotionEvent event) {

    switch (v.getId()) {
        case R.id.button1:
        case MotionEvent.ACTION_DOWN: {
            RelativeLayout.LayoutParams mParams = (RelativeLayout.LayoutParams)
                    i1.getLayoutParams();
            findViewById(R.id.imageView2).setBackgroundDrawable(getResources().getDrawable(R.drawable.realguy1));
            mParams.leftMargin -= 20;
                i1.setLayoutParams(mParams);
                break;
            }
        }
当我运行这段代码时,带有OnTouch侦听器的一个可以工作,但另一个不能

我做了很多研究,但我所做的一切都不起作用

我有两个听众

事实上,只有一个,这就是为什么

onTouch1
对SDK没有任何意义。你所做的只是定义一个方法。您的编译器甚至可能会告诉您该方法未使用

这两个都将
onTouch
,因为这就是
这个
的含义

left.setOnTouchListener(this);
right.setOnTouchListener(this);
因此,
是唯一的
视图。OnTouchListener
和它唯一的方法是
onTouch

如果您正确地注释了您的方法,您将看到这一点。比如说,

@Override // This is okay
public boolean onTouch(View view, MotionEvent event){ 

}

@Override // Not okay, nothing to override
public boolean onTouch1(View view, MotionEvent event){ 

}

现在,你可以做这样的事情来代替

使用唯一的
onTouch
方法,并在每个按钮上添加一个
开关(view.getId())
,带有一个
大小写

@Override
public boolean onTouch(View view, MotionEvent event){ 
    final int X = (int) event.getRawX();
    final int Y = (int) event.getRawY();
    switch (view.getId()) {
        case R.id.button1:
            // left
            switch (event.getAction() & MotionEvent.ACTION_MASK) {
                case MotionEvent.ACTION_DOWN:
                    // ...
            }
            return true;
        case R.id.button2:
            // right
            switch (event.getAction() & MotionEvent.ACTION_MASK) {
                case MotionEvent.ACTION_DOWN:
                    // ...
            return true;
    }
    return false;
}
当然,您可以决定将其重构为许多您认为合适的独立方法

例如,如果要保留
onTouch 1
,可以直接将
onTouch
委托给它

@Override
public boolean onTouch(View view, MotionEvent event){ 
    final int X = (int) event.getRawX();
    final int Y = (int) event.getRawY();
    switch (view.getId()) {
        case R.id.button1:
            // left
            switch (event.getAction() & MotionEvent.ACTION_MASK) {
                case MotionEvent.ACTION_DOWN:
                    // ...
            }
            return true;
        case R.id.button2:
            // right
            return onTouch1(view, event); // delegate to other method
    }
    return false;
}

另外,
case MotionEvent.ACTION\u DOWN:
不应在使用视图ID的交换机上触发,因此应将其删除

switch (v.getId()) {
    case R.id.button1:
    case MotionEvent.ACTION_DOWN: // Shouldn't work
我有两个听众

事实上,只有一个,这就是为什么

onTouch1
对SDK没有任何意义。你所做的只是定义一个方法。您的编译器甚至可能会告诉您该方法未使用

这两个都将
onTouch
,因为这就是
这个
的含义

left.setOnTouchListener(this);
right.setOnTouchListener(this);
因此,
是唯一的
视图。OnTouchListener
和它唯一的方法是
onTouch

如果您正确地注释了您的方法,您将看到这一点。比如说,

@Override // This is okay
public boolean onTouch(View view, MotionEvent event){ 

}

@Override // Not okay, nothing to override
public boolean onTouch1(View view, MotionEvent event){ 

}

现在,你可以做这样的事情来代替

使用唯一的
onTouch
方法,并在每个按钮上添加一个
开关(view.getId())
,带有一个
大小写

@Override
public boolean onTouch(View view, MotionEvent event){ 
    final int X = (int) event.getRawX();
    final int Y = (int) event.getRawY();
    switch (view.getId()) {
        case R.id.button1:
            // left
            switch (event.getAction() & MotionEvent.ACTION_MASK) {
                case MotionEvent.ACTION_DOWN:
                    // ...
            }
            return true;
        case R.id.button2:
            // right
            switch (event.getAction() & MotionEvent.ACTION_MASK) {
                case MotionEvent.ACTION_DOWN:
                    // ...
            return true;
    }
    return false;
}
当然,您可以决定将其重构为许多您认为合适的独立方法

例如,如果要保留
onTouch 1
,可以直接将
onTouch
委托给它

@Override
public boolean onTouch(View view, MotionEvent event){ 
    final int X = (int) event.getRawX();
    final int Y = (int) event.getRawY();
    switch (view.getId()) {
        case R.id.button1:
            // left
            switch (event.getAction() & MotionEvent.ACTION_MASK) {
                case MotionEvent.ACTION_DOWN:
                    // ...
            }
            return true;
        case R.id.button2:
            // right
            return onTouch1(view, event); // delegate to other method
    }
    return false;
}

另外,
case MotionEvent.ACTION\u DOWN:
不应在使用视图ID的交换机上触发,因此应将其删除

switch (v.getId()) {
    case R.id.button1:
    case MotionEvent.ACTION_DOWN: // Shouldn't work

很抱歉,我给你带来了一些困惑,但我不理解你写的很多东西,即使我做了研究,看看我是否能理解你的代码,你有
开关(v.getId()){case R.id.button1:
…我也是;)现在,我只为另一个按钮id添加了另一个case语句。就是这样!很抱歉,我给你带来了一些困惑,但我不理解你写的很多内容,即使我做了研究,看看我是否能理解你的代码,你有
开关(v.getId()){case R.id.button1:
…我也是;)现在,我只为另一个按钮id添加了另一个case语句。就是这样!