【问题标题】:Perform both the normal click and long click at button执行正常单击和长按按钮
【发布时间】:2013-09-20 07:34:25
【问题描述】:

我有一个名为 CheckIn 的按钮。看看我的代码。

    checkIn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

       Toast.makeText(HomeSafeActivity.this, "Normal Press", Toast.LENGTH_LONG).show();

    });


    checkIn.setOnLongClickListener(new View.OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {

            Toast.makeText(HomeSafeActivity.this, "Long press", Toast.LENGTH_LONG).show();



            return false;
        }
    });

现在,当我正常按下按钮时,消息显示为正常按下。当我长按按钮时,消息显示为长按和正常按下。我想要什么,当我长按按钮时,只有长按事件应该触发而不是正常的按下事件。我怎样才能实现这个?

【问题讨论】:

  • 在 onLongClickListener() 中禁用 onClickListener()。这可能是一种选择。我不确定它是否有效,只是激发想法:)
  • 我认为@ClaireG 是对的。尝试使用该解决方案。
  • onClickonLongClick 两个函数中放置一个标志,以相互排斥(通过if 语句)。如果您同时拥有两个侦听器,则无法取消捕获这两个事件之一。

标签: android button


【解决方案1】:

我得到了我的问题的解决方案。返回 true 而不是 false。请看下面:-

    checkIn.setOnLongClickListener(new View.OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {

            Toast.makeText(HomeSafeActivity.this, "Long preess", Toast.LENGTH_LONG).show();

            return true;
        }
    });

【讨论】:

    【解决方案2】:

    onLongClick() - 这将返回一个布尔值来指示您是否已经消费了该事件并且不应该进一步携带它。即return true表示您已经处理了该事件,它应该在这里停止; return false 如果您还没有处理它和/或事件应该继续到任何其他on-click listeners

    【讨论】:

    • 这是个好主意;但是,如果有别的东西而不是 Toast
    • 其实我只是在我的activity中定义了Toast作为例子。我使用startActivity而不是Toast并且这两个事件都被触发了
    • 长按也被认为是点击,所以这两个函数都被调用了。
    【解决方案3】:

    如果长按应该返回true

    示例:

      btnBookingMasterCab.setOnLongClickListener(new OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                if(preCheckoutInfo!=null){
                    rlChooseCard.setVisibility(View.VISIBLE);
                }
                return true;
            }
        });
    

    【讨论】:

      【解决方案4】:

      public boolean onLongClick(View v) is boolean 如果被点击返回true 所以让返回为真;

      【讨论】:

        【解决方案5】:

        这是一个解决方案(如果(当两者都被触发时),首先触发长按,然后正常按下,这将起作用):

        int clickFlag = 0;
        checkIn.setOnClickListener(new View.OnClickListener() {
        
          @Override
          public void onClick(View v) {
        
            if(clickFlag != 2){
              Toast.makeText(HomeSafeActivity.this, "Normal Press", Toast.LENGTH_SHORT).show();
              clickFlag = 0;
            }
        
          });
        
          checkIn.setOnLongClickListener(new View.OnLongClickListener() {
        
            @Override
            public boolean onLongClick(View v) {
        
              Toast.makeText(HomeSafeActivity.this, "Long press", Toast.LENGTH_SHORT).show();
        
              clickFlag = 2;
              return false;
            }
          });
        }
        

        【讨论】:

        • 长按返回true就不需要flag了
        【解决方案6】:

        试试这个;它应该工作。

        checkIn.setOnLongClickListener(new View.OnLongClickListener() {
        
            @Override
            public boolean onLongClick(View v) {
        
                checkIn.setOnClickListener(null);
        
                Toast.makeText(HomeSafeActivity.this, "Long press", Toast.LENGTH_LONG).show();
        
                return false;
            }
        });
        

        【讨论】:

          【解决方案7】:

          尝试 android:onclick="btnPressed" 而不是 OnClickListener 并在我的测试代码中使用 OnLongClickListener 没有问题

          【讨论】:

          • 那怎么区分长按和短按呢?
          • 是的,它仅在 onclick 事件发生时触发,而按钮变为长按它不会触发。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-02-04
          • 1970-01-01
          • 1970-01-01
          • 2011-06-16
          • 2020-10-28
          • 2020-12-22
          • 1970-01-01
          相关资源
          最近更新 更多