3

ロングクリックダウンとロングクリックアップの2つの別々のイベントが必要です。Androidでこれを行うにはどうすればよいですか?

私が試したことは次のとおりです

public class FfwRewButton extends ImageButton {

    public interface ButtonListener {

        void OnLongClickDown(View v);

        void OnLongClickUp(View v);
    }

    private ButtonListener mListener;

    private boolean mLongClicked = false;

    public FfwRewButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setFocusable(true);
        setLongClickable(true);
    }

    public FfwRewButton(Context context) {
        this(context, null);
    }

    public FfwRewButton(Context context, AttributeSet attrs) {
        this(context, attrs, android.R.attr.imageButtonStyle);
    }

    @Override
    public boolean onKeyLongPress(int keyCode, KeyEvent event) {
        Log.d("my listener", "long press");
        mLongClicked = true;
        mListener.OnLongClickDown(this);
        return super.onKeyLongPress(keyCode, event);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        Log.d("my listener", "key down");
        mLongClicked = false;
        if (true) {
            super.onKeyDown(keyCode, event);
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        Log.d("my listener", "key up");
        if (mLongClicked)
            mListener.OnLongClickUp(this);
        return super.onKeyUp(keyCode, event);
    }

    public void setFfwRewButtonListener(ButtonListener listener) {
        mListener = listener;
    }
}

そして、私はそれをこのように呼んだ活動で

private FfwRewButton.ButtonListener mListener = new FfwRewButton.ButtonListener() {

        @Override
        public void OnLongClickUp(View v) {
            Log.d(TAG, "longClickup");
        }

        @Override
        public void OnLongClickDown(View v) {
            Log.d(TAG, "longClickdown");
        }
    };

しかし、それでもlogcatにログメッセージが表示されません。誰か助けてもらえますか。私が間違っているところは?

4

3 に答える 3

7

onKeyXXX()メソッドは、キーボードまたはメニューキー、検索キーなどのハードキーからのキーイベント用です。

MotionEventAndroidで呼び出されるタッチイベントを検出する場合は、onTouchEvent(MotionEvent e)メソッドをオーバーライドし、GestureDetectorクラスを使用して長押しを識別する必要があります。

private GestureDetector mGestureDetector;

public FfwRewButton(...) {
    //....
    mGestureDetector = new GestureDetector(context, 
        new GestureDetector.SimpleOnGestureListener() {
            public boolean onDown(MotionEvent e) {
                mLongClicked = false;
                return true;
            }
            public void onLongPress(MotionEvent e) {
                mLongClicked = true;
                // long press down detected
            }
        });
    }

    public boolean onTouchEvent(MotionEvent e) {
        mGestureDetector.onTouchEvent(e);
        if (mLongClicked && e.getAction() == ACTION_UP) {
           // long press up detected
        }
    }
}
于 2013-02-14T14:46:46.183 に答える
3

このような何かがあなたを正しい道に導くでしょう、

私はコンパイルしなかったので、いくつかの構文を修正する必要があるかもしれませんが、この概念で目標を達成できます

OnTouchListener mTouchListener = new OnTouchListener(){
  private totalTimeDown = -1;
  private downTime = -1;
  public boolean onTouch(View v, MotionEvent me){
    if(me.getAction() == MotionEvent.ACTION_DOWN){
        downTime = System.getCurrentTimeInMillis();
        return true;
    }

    if(me.getAction() == MotionEvent.ACTION_UP){
        totalTimeDown = System.getCurrentTimeInMillis() - downTime;
        if(totalTimeDown > 500){
            //Finger was down long enough for "longClick"
            return true;
        }
    }
    return false;
  }
});
于 2013-02-14T14:41:49.010 に答える
0
holder.layout.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch(event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        new Handler().postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                holder.layoutItem.setVisibility(View.GONE);
                                holder.layoutDelete.setVisibility(View.VISIBLE);
                            }
                        }, 1000);
                        // PRESSED
                        return true; // if you want to handle the touch event
                    case MotionEvent.ACTION_UP:
                        holder.layoutItem.setVisibility(View.VISIBLE);
                        holder.layoutDelete.setVisibility(View.GONE);
                        // RELEASED
                        return true; // if you want to handle the touch event
                }
                return false;
            }
        });
于 2019-09-21T18:42:22.917 に答える