8

ほぼ同じことを行うボタンがかなりあるので、複数のボタンのタッチリスナーを実装する単一のメソッドを作成する方法があるかどうかを確認しようとしています。彼らが行うことの唯一の違いは、sendMessage() メソッドを介して送信するメッセージと、メッセージを送信するためにボタンを押し続ける必要がある時間です。それを行う方法があるとすれば、それはどのようなものでしょうか? また、なぜこのようなものがうまくいかないのでしょうか?

//Within onCreate Method...
Button mButton = (Button) findViewbyId(R.id.three_sec_button);
mButton = addTouchTimer(mButton, 3, 3);

通話 -

private Button addTouchTimer(Button button, final int sec, final int messageNum){
        button.setOnTouchListener(new View.OnTouchListener() {
            boolean longEnough = false;
            long realTimeLeft = sec * 1000;
            @Override
            // This will make it so that a message is only sent if the button is held down for 3 seconds
            // Otherwise it won't send. It is sent during the hold down process, releasing it returns a false
            // value and no message is sent.
            public boolean onTouch(View arg0, MotionEvent arg1) {
                Log.d("Button", "Touchy Touchy!");
                if(arg1.getAction() == MotionEvent.ACTION_DOWN){
                    buttonPressTime = new CountDownTimer(realTimeLeft, 1000){
                        @Override
                        public void onTick(long millisUntilDone){
                                realTimeLeft = millisUntilDone;
                        }

                        @Override
                        public void onFinish() {  
                            long timeLeft = realTimeLeft;
                            long currTime = System.currentTimeMillis();
                            long realFinishTime = currTime + timeLeft;
                                while(currTime < realFinishTime){
                                    currTime = System.currentTimeMillis();
                                }
                            longEnough = true;
                            sendEmergencyMessage(longEnough, messageNum);
                        }
                    }.start();
                }
                else if(arg1.getAction() == MotionEvent.ACTION_UP){
                    buttonPressTime.cancel();
                    sendMessage(longEnough, messageNum);
                }
                return longEnough;
            }           
        });

        return button;
    }

効率のために、ボタンごとに個別のリスナーを実装するよりも良い方法が必要なようです。注意として、 sendMessage() にはブール値を利用するログ呼び出しが含まれています。渡されたときにどのように設定されているかを確認したいと思います。これが、ボタンを離すときに呼び出される唯一の理由です。

4

9 に答える 9

20

はい、あなたは正しいです、より良い方法があります。すべてを処理する単一の TouchListener で、id を介してどのボタンであるかを判断します。

void intialization(){
     Button m1, m2, m3, m4;
     ... //do initialization stuff
     m1.setId(1);
     m2.setId(2);
     m3.setId(3);
     m4.setId(4);
     MyTouchListener touchListener = new MyTouchListener();
     m1.setOnTouchListener(touchListener);
     m2.setOnTouchListener(touchListener);
     m3.setOnTouchListener(touchListener);
     m4.setOnTouchListener(touchListener);
 }

public class MyTouchListener implements OnTouchListener {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch(v.getId()){
            case 1:
                //do stuff for button 1
                break;
            case 2:
                //do stuff for button 2
                break;
            case 3:
                //do stuff for button 3
                break;
            case 4:
                //do stuff for button 4
                break;
        }
        return true;
    }

}

そして、それはあなたがそれを行う方法です!この場合、ID の数値アプローチが非常に役立ちます。もう 1 つの方法は、アクティビティに OnTouchListener を実装させることです。そうすれば、コードはさらに単純になります。

public class MyActivity extends Activity implements OnTouchListener {

    void initialization(){
        Button m1, m2, m3, m4;
        ... //do initialization stuff
        m1.setId(1);
        m2.setId(2);
        m3.setId(3);
        m4.setId(4);
        m1.setOnTouchListener(this);
        m2.setOnTouchListener(this);
        m3.setOnTouchListener(this);
        m4.setOnTouchListener(this);
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch(v.getId()){
            case 1:
                //do stuff for button 1
                break;
            case 2:
                //do stuff for button 2
                break;
            case 3:
                //do stuff for button 3
                break;
            case 4:
                //do stuff for button 4
                break;
        }
        return true;
    }

}

注: このアプローチは、OnClickListener、OnCheckedChangeListener、または Android ビューで設定するその他のリスナーでも機能します。

于 2013-07-25T17:03:52.577 に答える
1

私は2つの答えをマージします、これは私のコードです

public class MyActivity extends Activity implements OnTouchListener {
Button mGreen, mRed;

void initialization() {

    ... //do initialization stuff

    mGreen.setOnTouchListener(this);
    mRed.setOnTouchListener(this);
}

@Override
public boolean onTouch(View v, MotionEvent event) {


    switch (event.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:
            actionDown();
            break;
        case MotionEvent.ACTION_UP:
            actionUp();
            break;

        case MotionEvent.ACTION_POINTER_DOWN:
            break;

        case MotionEvent.ACTION_POINTER_UP:
            break;

        case MotionEvent.ACTION_MOVE:
            actionMove();
            break;
    }

    return true;
}

public void actionDown() {
    switch (view.getId()) {
        case R.id.button_green:
            //todo
            break;

        case R.id.button_red:
            //todo
            break;
    }
}

public void actionUp() {
    switch (view.getId()) {
        case R.id.button_green:
            //todo
            break;


        case R.id.button_red:
            //todo
            break;
    }
}

public void actionMove() {
    switch (view.getId()) {
        case R.id.button_green:
            // todo
            break;

        case R.id.button_red:
            // todo
            break;
    }

}}

このコードが誰かに役立つことを願っています

于 2016-02-02T16:18:28.667 に答える
1
OnTouchListener mOnTouchListener = new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // Code goes here
    return true;
    }
};

button1.setOnTouchListener(mOnTouchListener);
button2.setOnTouchListener(mOnTouchListener);
于 2013-07-25T18:09:02.253 に答える
0

なぜバターナイフを使わないのですか?

@Nullable @OnClick({R.id.btn1, R.id.btn2,R.id.btn3, R.id.btn4})
public void doStuff(Button button) {}
于 2016-04-11T12:26:13.027 に答える