Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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 实现我自己的Ontouch侦听器_Android_Ontouchlistener - Fatal编程技术网

Android 实现我自己的Ontouch侦听器

Android 实现我自己的Ontouch侦听器,android,ontouchlistener,Android,Ontouchlistener,我想创建我自己的OnTouchListener。然后我想将其封装到一个.jar文件中,以使其可重用 这是我的特定听众: public class TouchableView extends View implements OnTouchListener{ myTouch t=null; public TouchableView(Context context) { super(context); // Set KeyListener to ou

我想创建我自己的OnTouchListener。然后我想将其封装到一个.jar文件中,以使其可重用

这是我的特定听众:

public class TouchableView extends View implements OnTouchListener{

    myTouch t=null;

    public TouchableView(Context context) {
        super(context);
        // Set KeyListener to ourself
        this.setOnTouchListener(this);
    }
    public TouchableView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // Set KeyListener to ourself
        this.setOnTouchListener(this);
    }
    public TouchableView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // Set KeyListener to ourself
        this.setOnTouchListener(this);
    }

    public void setmyTouch(myTouch listener) {
        t = listener;
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction()==MotionEvent.ACTION_DOWN){
            t.downTouch();
            return true;
        }
        return false;
    }

    public interface myTouch{
        public abstract boolean downTouch();
    }

}
这就是我试图使用它的方式:

public class MyTouchImplement extends Activity implements myTouch{
    /** Called when the activity is first created. */

    TextView tv;
    int i=0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        tv=(TextView) findViewById(R.id.tv);

        TouchableView view = (TouchableView) findViewById(R.id.view);
        view.setmyTouch(this);
    }

    @Override
    public boolean downTouch() {
        i++;
        tv.setText(i+"");
        return true;
    }
}

我想让它适用于OnTouchListener使用的每个组件。

您已经创建了一个非常复杂的依赖关系网络,您应该简化它。例如,您不应该像这样传递活动对象

另外,在创建活动类时,不需要重新定义构造函数。使用超级构造函数很好。您需要定义的是
onCreate
onStart
onPause
onStop
onstroy
方法。我强烈建议你读这本书

一个比上面更简单的实现是去掉myTouch界面。从
TouchableView
类中删除
implements OnTouchListener
,并在活动类中创建一个
OnTouchListener

它看起来像这样:

public class MyTouchActivity extends Activity{

    TouchableView tv;

    public void onCreate(Bundle savedInstanceState) {       
            super.onCreate(savedInstanceState);
        tv = new TouchableView();
        tv.setOnTouchListener(new MyOwnTouchListener());
    }

    class MyOnTouchListener implements OnTouchListener{

        public boolean onTouchEvent(View v, MotionEvent e){
            switch(e.getAction){
            case (MotionEvent.TOUCH_DOWN)
                MyTouchActivity.this.touchDown();
                break;
            }

        }
    }
    public boolean touchDown(){
        //touch down happened
    }
}

您已经创建了一个非常复杂的依赖关系网,您应该简化它。例如,您不应该像这样传递活动对象

另外,在创建活动类时,不需要重新定义构造函数。使用超级构造函数很好。您需要定义的是
onCreate
onStart
onPause
onStop
onstroy
方法。我强烈建议你读这本书

一个比上面更简单的实现是去掉myTouch界面。从
TouchableView
类中删除
implements OnTouchListener
,并在活动类中创建一个
OnTouchListener

它看起来像这样:

public class MyTouchActivity extends Activity{

    TouchableView tv;

    public void onCreate(Bundle savedInstanceState) {       
            super.onCreate(savedInstanceState);
        tv = new TouchableView();
        tv.setOnTouchListener(new MyOwnTouchListener());
    }

    class MyOnTouchListener implements OnTouchListener{

        public boolean onTouchEvent(View v, MotionEvent e){
            switch(e.getAction){
            case (MotionEvent.TOUCH_DOWN)
                MyTouchActivity.this.touchDown();
                break;
            }

        }
    }
    public boolean touchDown(){
        //touch down happened
    }
}

以下内容适合我。请检查一下这是否有帮助。请随意修改构造函数以满足您的需要。对于这个测试,我使用了一个带有两个TextView(txtxty)字段和一个GridLayout控件的线性布局

扫雷机器人touch.java
以下内容适合我。请检查一下这是否有帮助。请随意修改构造函数以满足您的需要。对于这个测试,我使用了一个带有两个TextView(txtxty)字段和一个GridLayout控件的线性布局

扫雷机器人touch.java
它不起作用。在触摸视图视图=(触摸视图)findViewById(R.id.view)行;这涉及到将自定义视图放置在布局XML中。请发布该布局,并说明您得到的确切错误。我已经尝试了包含LinearLayout的布局,并在其中添加了一个视图。错误是ClassCastException android.widget.LinearLayoutOh我知道你的意思。因此,如果我想这样做,我需要添加自定义视图。但这正是我想要回避的,因为如果我这样做,我必须一个接一个地实现每个组件。没有办法不扩展组件就可以做到这一点吗?它不起作用。在触摸视图视图=(触摸视图)findViewById(R.id.view)行;这涉及到将自定义视图放置在布局XML中。请发布该布局,并说明您得到的确切错误。我已经尝试了包含LinearLayout的布局,并在其中添加了一个视图。错误是ClassCastException android.widget.LinearLayoutOh我知道你的意思。因此,如果我想这样做,我需要添加自定义视图。但这正是我想要回避的,因为如果我这样做,我必须一个接一个地实现每个组件。在不扩展组件的情况下,有没有办法做到这一点?主要目标是封装一些复杂的触摸模式,以便下次我只需添加.jar文件并覆盖我需要的方法。这样我就无法覆盖着陆方法。这就是为什么我必须用一个抽象的触地方法来制作一个界面。好的,那很好,可以简单地让MyTouchAcvity实现界面myTouch界面,然后你试过了吗?我试过多种方法,但都不管用。如果你能把你的解决方案寄给我,我将不胜感激。提前谢谢。主要目标是封装一些复杂的触摸模式,这样下次我只需添加.jar文件并覆盖我需要的方法。这样我就无法覆盖着陆方法。这就是为什么我必须用一个抽象的触地方法来制作一个界面。好的,那很好,可以简单地让MyTouchAcvity实现界面myTouch界面,然后你试过了吗?我试过多种方法,但都不管用。如果你能把你的解决方案寄给我,我将不胜感激。先谢谢你。