Изберете други бутони при докосване

Пиша тест кои опции са поставени в бутоните. Имам селектор за бутони, който показва нормално и натиснато състояние и всичко работи чудесно. Това, което искам е, когато потребителят докосне опция и премине към следващата опция, следващият бутон получава фокус и избира. И когато потребителят хване ръката, извършете щракване върху избрания бутон.

потребител докосва една от опциитепотребителят преминава към следващата опция

В изображенията по-горе можете да видите точно какво имам предвид.


person hojjat reyhane    schedule 02.02.2015    source източник


Отговори (1)


Трябва да напишете персонализирано управление на събития при докосване, което ще задейства setPressed(true) на MotionEvent.ACTION_DOWN ИЛИ MotionEvent.ACTION_MOVE (реализацията по подразбиране очаква винаги да получава MotionEvent.ACTION_DOWN).

Код като този трябва да работи (добавете го към всичките си бутони):

button.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
                if (!v.isPressed()) {
                    v.setPressed(true);
                }
                return true;
            case MotionEvent.ACTION_UP:
                // perform action ON CLICK
                break;
        }

        v.setPressed(false);
        return false;
    }
});
person Bartek Lipinski    schedule 02.02.2015
comment
това решение не работи, защото когато докосването се движи, това е само за бутона, от който потребителят стартира, а други бутони няма да реагират на него. - person hojjat reyhane; 02.02.2015
comment
дори пробвал ли си го? Важната част е, че когато пръстът пресече границата на бутон, зоната за докосване MotionEvent.Action_CANCEL трябва да бъде извикана на този бутон и след това в примера, който предоставих, onTouch слушателят ще върне false. Поради това управлението на събития чрез докосване ще бъде предадено на други компоненти. - person Bartek Lipinski; 02.02.2015
comment
да, пробвах го. проблемът е, че MotionEvent.Action_CANCEL не се извиква при докосване наляво от бутона. всъщност cancel никога не се обади във връзка, регистрирах го и не знам защо. - person hojjat reyhane; 02.02.2015
comment
Тези бутони съхраняват ли се в някакъв вид ScrollView? - person Bartek Lipinski; 02.02.2015
comment
Е, ще трябва да проверя кода, за да намеря истинската причина, поради която събитието не се извиква тогава... Другият подход, който можете да предприемете, е да добавите onTouchEvent слушател към вашия LinearLayout вместо към вашите бутони. Вътре в този слушател, ако се задейства събитие MOVE или DOWN, вие намирате подходящо View за това събитие (въз основа на координатите на събитието на докосване), задавате неговото натиснато състояние на true, а за всички останали натиснати състояния на false. Когато се открие MotionEvent.Action_UP, изпълнете действие при щракване за правилното View. - person Bartek Lipinski; 02.02.2015
comment
да, това е верният отговор, че работих върху него около 3 часа и го поправих. целта на този въпрос беше да попита дали съществува някакво по-лесно решение. благодаря, че сподели знанията си. - person hojjat reyhane; 02.02.2015
comment
Има ли някакво решение за това? - person Amit Sharma; 21.11.2016