ACTION_UP не распознает после Action_DOWN

В моем проекте мне нужно использовать onTouchListener, чтобы я знал, когда пользователь касается\не трогает определенные кнопки и отправляет данные на мой сервер в обоих случаях. код:

 private View.OnTouchListener handleTouch = new View.OnTouchListener() {
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, MotionEvent event) {

    switch (v.getId()) {
        case R.id.Abtn:
            onControl("BA",v, event);
            break;
        case R.id.Bbtn:
            onControl("BB", v, event);
            break;
        case R.id.Xbtn:
            onControl("BX",v, event);
            break;
        case R.id.Ybtn:
            onControl("BY",v, event);
            break;
        case R.id.Rbtn:
            onControl("BR",v, event);
            break;
        case R.id.Lbtn:
            onControl("BL",v, event);
            break;
        case R.id.UpBtn:
            onControl("BU",v, event);
            break;
        case R.id.Dbtn:
            onControl("BD",v, event);
            break;
        case R.id.RTbtn:
            onControl("RT",v, event);
            break;
        case R.id.LTbtn:
            onControl("LT",v, event);
            break;
        case R.id.Start_btn:
            onControl("ST",v, event);
            break;
        case R.id.Back_btn:
            onControl("CK",v, event);
            break;
        case R.id.RB_btn:
            onControl("RB",v, event);
            break;
        case R.id.LB_btn:
            onControl("LB",v, event);
            break;


    }
    return true;
}
};

пробовал добавить action_cancle - проблема пока не решилась. в основном, что произошло, так это то, что я получаю только событие \ данные действия вниз, которые я отправляю, и если действие вверх никогда не распознается. я проверил по всему Интернету, и общий ответ состоял в том, чтобы вернуть true в каждом случае функции onTouch, что имеет смысл, но это именно то, что я делаю, и все еще не могу заставить его работать.

на контроле:

 private void onControl(String st,View v, MotionEvent event){
    if(event.getAction() == MotionEvent.ACTION_DOWN){
        new SendMessage().execute("S"+ st);
    }
    if(event.getAction() == MotionEvent.ACTION_UP){
        new SendMessage().execute("P "+ st);
    }
}

макет:

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageButton
    android:id="@+id/Bbtn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"

    android:layout_alignParentStart="true"
    android:layout_alignParentTop="true"
    android:layout_marginStart="20dp"
    android:layout_marginTop="84dp"
    android:background="#00000000"
    android:contentDescription="@string/desc"
    android:src="@drawable/button_b" />

<ImageButton
    android:id="@+id/Xbtn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="84dp"
    android:layout_marginStart="120dp"
    android:background="#00000000"
    android:contentDescription="@string/desc"
    android:src="@drawable/button_x" />

<ImageButton
    android:id="@+id/Abtn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="134dp"
    android:layout_marginStart="70dp"
    android:background="#00000000"
    android:contentDescription="@string/desc"
    android:src="@drawable/button_a" />

<ImageButton
    android:id="@+id/Ybtn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="34dp"
    android:layout_marginStart="70dp"
    android:background="#00000000"
    android:contentDescription="@string/desc"
    android:src="@drawable/button_y" />
<ImageButton
    android:id="@+id/RTbtn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="210dp"
    android:layout_marginTop="30dp"
    android:background="#00000000"
    android:contentDescription="@string/desc"
    android:src="@drawable/rt_button" />
<ImageButton
    android:id="@+id/LTbtn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="500dp"
    android:layout_marginTop="30dp"
    android:background="#00000000"
    android:contentDescription="@string/desc"
    android:src="@drawable/lt_button" />


<ImageButton
    android:id="@+id/UpBtn"

    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="500dp"
    android:layout_marginTop="230dp"
    android:background="#00000000"
    android:contentDescription="@string/desc"
    android:rotation="-90"
    android:src="@drawable/sides_b" />

<ImageButton
    android:id="@+id/Rbtn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="465dp"
    android:layout_marginTop="265dp"
    android:background="#00000000"
    android:contentDescription="@string/desc"
    android:src="@drawable/sides_b" />

<ImageButton
    android:id="@+id/Lbtn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="535dp"
    android:layout_marginTop="265dp"
    android:background="#00000000"
    android:contentDescription="@string/desc"
    android:rotation="180"
    android:src="@drawable/sides_b" />
<ImageButton
    android:id="@+id/Dbtn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="500dp"
    android:layout_marginTop="300dp"
    android:background="#00000000"
    android:contentDescription="@string/desc"
    android:rotation="90"
    android:src="@drawable/sides_b" />

<ImageButton
    android:id="@+id/Start_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="300dp"
    android:layout_marginTop="50dp"
    android:background="#00000000"
    android:contentDescription="@string/desc"
    android:src="@drawable/start_btn" />
<ImageButton
    android:id="@+id/Back_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="420dp"
    android:layout_marginTop="50dp"
    android:background="#00000000"
    android:contentDescription="@string/desc"
    android:rotation="180"
    android:src="@drawable/start_btn" />
<ImageButton
    android:id="@+id/LB_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="470dp"
    android:layout_marginTop="130dp"
    android:background="#00000000"
    android:contentDescription="@string/desc"
    android:src="@drawable/lb_btn" />
<ImageButton
    android:id="@+id/RB_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="210dp"
    android:layout_marginTop="130dp"
    android:background="#00000000"
    android:contentDescription="@string/desc"
    android:src="@drawable/rb_btn" />

настройка слушателей:

 private void initView(){
    ImageButton A =  findViewById(R.id.Abtn);
    ImageButton B = findViewById(R.id.Bbtn);
    ImageButton X =  findViewById(R.id.Xbtn);
    ImageButton Y =  findViewById(R.id.Ybtn);
    ImageButton Rside =  findViewById(R.id.Rbtn);
    ImageButton Lside =  findViewById(R.id.Lbtn);
    ImageButton Up =  findViewById(R.id.UpBtn);
    ImageButton Down =  findViewById(R.id.Dbtn);
    ImageButton Rt =  findViewById(R.id.RTbtn);
    ImageButton Lt =  findViewById(R.id.LTbtn);
    ImageButton Start = findViewById(R.id.Start_btn);
    ImageButton Back = findViewById(R.id.Back_btn);
    ImageButton Rb = findViewById(R.id.RB_btn);
    ImageButton Lb = findViewById(R.id.LB_btn);

    A.setOnTouchListener(handleTouch);
    B.setOnTouchListener(handleTouch);
    X.setOnTouchListener(handleTouch);
    Y.setOnTouchListener(handleTouch);
    Rside.setOnTouchListener(handleTouch);
    Lside.setOnTouchListener(handleTouch);
    Up.setOnTouchListener(handleTouch);
    Down.setOnTouchListener(handleTouch);
    Rt.setOnTouchListener(handleTouch);
    Lt.setOnTouchListener(handleTouch);
    Start.setOnTouchListener(handleTouch);
    Back.setOnTouchListener(handleTouch);
    Rb.setOnTouchListener(handleTouch);
    Lb.setOnTouchListener(handleTouch);

}

person Ido    schedule 04.04.2018    source источник
comment
Вы видели stackoverflow.com/a/12588509/3974530 или stackoverflow.com/questions/15799839/   -  person InsaneCat    schedule 04.04.2018
comment
я видел эти сообщения, но проверьте, что моя проблема не в том, чтобы вернуть true..   -  person Ido    schedule 04.04.2018


Ответы (1)


Если вы используете представление внутри группы представлений, то, возможно, ViewGroup берет на себя управление вашими сенсорными перехватами,

попробуй: requestDisallowInterceptTouchEvent(true);

внутри места, где вы слушаете ваше событие ACTION_DOWN.

Измените свой метод onControl() на:

private void onControl(String st,View v, MotionEvent event){
if(event.getAction() == MotionEvent.ACTION_DOWN){
   requestDisallowInterceptTouchEvent(true);
   new SendMessage().execute("S"+ st);
}
else if(event.getAction() == MotionEvent.ACTION_UP){
   requestDisallowInterceptTouchEvent(false);
   new SendMessage().execute("P "+ st);
}} 

Я не уверен в этом, но стоит попробовать.

person MadScientist    schedule 04.04.2018
comment
не совсем понял, когда вы хотите, чтобы я поместил эту строку (новый для Android и Java) - person Ido; 04.04.2018
comment
проверьте редактирование, добавьте этот метод управления и проверьте один раз. - person MadScientist; 04.04.2018
comment
Не удается разрешить метод requestDisallowTouchInterceptEvent (логическое значение) - person Ido; 04.04.2018
comment
v.requestDisallowInterceptTouchEvent(); я не использовал IDE при ответе, поэтому E&OE - person MadScientist; 04.04.2018
comment
Можешь выложить свой макет пожалуйста - person MadScientist; 04.04.2018
comment
Макет как в том месте, где вы получаете ошибку разрешения - person MadScientist; 04.04.2018
comment
извините, что я не знаком с этим, но я не получаю ошибку разрешения. я должен просто опубликовать макет? - person Ido; 04.04.2018
comment
добавил макет. - person Ido; 04.04.2018
comment
я видел, что если вы делаете v.getparent().request... он распознает метод, но все равно не работает после выполнения попытки. - person Ido; 04.04.2018
comment
Добавьте также java. Место, где вы добавили строку, я тоже вас спросил. - person MadScientist; 04.04.2018
comment
Вы имеете в виду отредактированный на контроле? я добавил. дайте мне знать, если это то, что вы имели в виду. - person Ido; 04.04.2018
comment
Хорошо, как насчет переопределения метода onTouchIntercept(). и добавьте журнал, event.toString() и проверьте, передается ли событие в дочерние представления или нет. - person MadScientist; 04.04.2018
comment
я попробую поискать в интернете, как это сделать. я не хочу беспокоить вас. - person Ido; 04.04.2018
comment
Я попытался настроить on touch по-другому. все еще не работает, но может быть у вас есть другая идея на этот счет? - person Ido; 04.04.2018