Android. Могу ли я использовать setOnLongClickListener и setOnClickListener для одной и той же кнопки?

Могу ли я действительно использовать эти setOnLongClickListener и setOnClickListener для одной и той же кнопки? Потому что, если я долго нажимаю кнопку, будут выполнены как длинный, так и обычный щелчок, и я не знаю, почему. Я действительно могу это сделать? Пожалуйста помогите:)

              readDbButton.setOnLongClickListener(
                      new View.OnLongClickListener() {
                          public boolean onLongClick(View view) {
                                //do something
                              return false;
                          }
                      }
              );                  

              readDbButton.setOnClickListener(
              new View.OnClickListener()
              {
                  public void onClick(View view)
                  {
                        //Do something else
                  }
              });

person user2034859    schedule 14.05.2014    source источник
comment
Да, конечно.. Вы можете это сделать.. Хорошим примером этого являются кнопки на вашей клавиатуре.. Их можно как нажимать, так и долго нажимать...   -  person Lal    schedule 14.05.2014
comment
Элемент быстрого действия Actionbar использует их оба. Когда пользователь делает долгий щелчок, на экране появляется Toast. Когда пользователь делает щелчок, происходит событие щелчка.   -  person Glenn    schedule 14.05.2014
comment
вы можете использовать детектор жестов для обработки обоих   -  person Biraj Zalavadia    schedule 14.05.2014
comment
Вместо «вернуть false» в вашем OnLongClickListener() сделайте «вернуть true», вот и все!   -  person Ramakishna Balla    schedule 14.05.2014


Ответы (3)


верните TRUE в свой метод onLongClick, чтобы событие было использовано.

  readDbButton.setOnLongClickListener(
                      new View.OnLongClickListener() {
                          public boolean onLongClick(View view) {
                                //do something
                              return true;
                          }
                      }
              );   
person null pointer    schedule 14.05.2014

Попробуйте этот правильный способ реализовать это

public class MainActivity extends Activity {

    private Button button;
    private GestureDetector gestureDetector;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        gestureDetector = new GestureDetector(this, new MyGestureDetector());
        button = (Button) findViewById(R.id.button);

        button.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View arg0, MotionEvent ev) {
                return gestureDetector.onTouchEvent(ev);
            }
        });
    }

    private class MyGestureDetector extends SimpleOnGestureListener {

        @Override
        public boolean onSingleTapConfirmed(MotionEvent event) {
            Toast.makeText(MainActivity.this, "Single Tap", Toast.LENGTH_SHORT).show();
            return true;
        }

        @Override
        public void onLongPress(MotionEvent e) {
            Toast.makeText(MainActivity.this, "Long Tap", Toast.LENGTH_SHORT).show();
        }

    }

}
person Biraj Zalavadia    schedule 14.05.2014

Я получил решение вашего вопроса. Верните true вместо false в LongPressed. Просто смотрите ниже: -

   readDbButton.setOnLongClickListener(new View.OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {

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

            return true;
        }
    });

То есть верните true, чтобы указать, что вы обработали событие и на этом следует остановиться; вернуть false, если вы не обработали его, и/или событие должно продолжаться для любых других слушателей по клику

person AndroidGeek    schedule 14.05.2014