onSingleTapConfirmed никогда не срабатывает - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь реализовать прослушиватель щелчков для касания и переключения, но по какой-то причине метод onSingleTapConfirmed никогда не запускается, и я не знаю, почему.

Я пробовал это в другомпроект только с двумя кнопками, и у меня не было никаких проблем с его реализацией, но по какой-то причине в этом приложении он не работает, даже если код тот же.

MyGestureDetector.class:

открытый класс MyGestureDetector extends GestureDetector.SimpleOnGestureListener {

private MainGame mainGame;

MyGestureDetector(MainGame mainGame) {
    this.mainGame = mainGame;
}

@Override
public boolean onDown(MotionEvent e) {
    Log.d("GESTURE", "OnDOwn detected");
    return true;
}

@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
    Log.d("GESTURE: ", "Single Tap detected");
    mainGame.clickedView();
    return true;
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    try {
        if (e1.getY() < e2.getY()) {
            Log.d("Gesture", "Up to Down swipe: " + e1.getY() + " - " + e2.getY());
            Log.d("Speed", String.valueOf(velocityY) + "pixels/second");
            Objects.requireNonNull(mainGame.getSupportActionBar()).show();
        }

        if (e1.getY() > e2.getY()) {
            Log.d("Gesture", "Down to Up swipe: " + e1.getY() + " - " + e2.getY());
            Log.d("Speed", String.valueOf(velocityY) + "pixels/second");
            Objects.requireNonNull(mainGame.getSupportActionBar()).hide();
        }

    } catch (NullPointerException e) {
        Log.d("ActionBar: ", "Nullpoint caught");
    }
    return true;
}
}

MainGame.class (фрагменты):

public class MainGame extends AppCompatActivity implements View.OnTouchListener {
ConstraintLayout layout;
TextView fullNameP1;
TextView fullNameP2;
TextView gameScoreP1;
TextView gameScoreP2;
View mCurrenView;
private MyGestureDetector = myGestureDetector;
private GestureDetector mGestureDetector;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
    Objects.requireNonNull(getSupportActionBar()).hide();
    setContentView(R.layout.activity_main_game);

    initializeLayoutViews();
    initializeLayoutValues();

    int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN
            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_IMMERSIVE;
    layout.setSystemUiVisibility(uiOptions);


    layout.setOnTouchListener(this);
    gameScoreP1.setOnTouchListener(this);        
    gameScoreP2.setOnTouchListener(this);
    fullNameP1.setOnTouchListener(this);
    fullNameP2.setOnTouchListener(this);
}

private void initializeLayoutViews() {
layout = findViewById(R.id.gameLayout);
mainLayout.clone(layout);
fullNameP1 = findViewById(R.id.fullNameP1);
fullNameP2 = findViewById(R.id.fullNameP2);
gameScoreP1 = findViewById(R.id.gameScoreP1);
gameScoreP2 = findViewById(R.id.gameScoreP2);
myGestureDetector = new MyGestureDetector(this);
mGestureDetector = new GestureDetector(this, myGestureDetector);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    this.mGestureDetector.onTouchEvent(event);
    return super.onTouchEvent(event);
}

@Override
public boolean onTouch(View v, MotionEvent event) {
    mCurrenView = v;
    return this.mGestureDetector.onTouchEvent(event);
}

void clickedView() {
switch(mCurrenView.getId()) {
//perform actions
}
}
}

И это мой журналв любом месте экрана:

2019-02-23 17: 51: 24,801 7177-7177 / пакет D / ЖЕСТ: обнаружен самостоятельно 2019-02-23 17: 51: 25,612 7177-7177 / пакетD / GESTURE: обнаружен OnDOwn 2019-02-23 17: 51: 26.190 7177-7177 / пакет D / GESTURE: обнаружен OnDOwn 2019-02-23 17: 51: 26.718 7177-7177 / пакет D / GESTURE: обнаружен OnDOwn 2019-02-23 17: 51: 26,869 7177-7177 / пакет D / Жест: пролистывание вниз: 275,33337 - -5,333313 2019-02-23 17: 51: 27.364 7177-7177 / пакет D / ЖЕСТ: Обнаружен OnDOwn 2019-02-23 17: 51: 27.575 7177-7177 / пакет D / Жест: пролистывание вверх: 466.6667 - 772.3962 2019-02-23 17: 51: 28.438 7177-7177 / пакет D / ЖЕСТ: обнаружен OnDOwn 2019-02-23 17: 51: 28.643 7177-7177 / пакет D / жест: пролистывание вниз: 215.33337 - -52.07727 2019-02-23 17: 51: 29.224 7177-7177 / пакет D / ЖЕСТ: Обнаружен OnDOwn 2019-02-23 17: 51: 29.414 7177-7177 / пакет D / Жест: пролистывание вверх: 8,0 - 272,0 2019-02-23 17: 51: 30.584 7177-7177 / пакет D / GESTURE: обнаружен OnDOwn 2019-02-23 17: 51: 35.959 7177-7177 / пакет D / GESTURE: обнаружен OnDOwn 2019-02-23 17: 51: 36.356 7177-7177 / пакет D / GESTURE: обнаружен OnDOwn 2019-02-23 17: 51: 36.737 7177-7177 / пакет D / GESTURE: обнаружен OnDOwn

Как видите, onSingleTapConfirmed никогда не запускаетсядаже если все, что я делаю, - это простое нажатие, когда OnDown не предшествует пролистывание.

РЕДАКТИРОВАТЬ Провел несколько тестовых журналов действий, и проблема в том, что детектор жестов не видит ни одного из моих представлений, кроме layout по какой-то причине, потому что onSingleTapConfirmed вызывается вне любоготекстовых представлений, а также, если я отключу слушателя для них.Мне действительно нужна помощь, ребята!

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Возвращает значение, предоставленное GestureDetector 's onTouchEvent:

@Override
public boolean onTouchEvent(MotionEvent event) {
    return this.mGestureDetector.onTouchEvent(event);
}
0 голосов
/ 24 февраля 2019

Похоже, что другие представления по какой-то причине были недоступны для клика.

Код теперь работает так, как задумано, после добавления следующего к перед добавлением слушателей:

    gameScoreP1.setClickable(true);
    gameScoreP2.setClickable(true);
    fullNameP1.setClickable(true);
    fullNameP2.setClickable(true);
...