Как кодировать кнопку с различными эффектами при многократном нажатии - PullRequest
0 голосов
/ 04 ноября 2018

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

Я кодировал это на Android Studio 3.0, мне (вряд ли) удалось разместить файлы PNG на экране, сделав их похожими на кнопку. Дело в том, что в то время как некоторые части приложения в основном состоят из независимых кнопок, которые можно переключать. Там часть, где нажатие кнопки должно отменить выбор других. И, если эту кнопку нажать второй раз, откройте другие действия.

Вот часть моего кода, который я использую.

Этот для независимых кнопок

indbutton1.setOnTouchListener(new View.OnTouchListener(){
        // track if the image is selected or not
        boolean isSelected = true;

        public boolean onTouch(View v, MotionEvent event) {
            if(isSelected) {
                indbutton1.setImageResource(R.drawable.indbutton1slct);
            } else {
                indbutton1.setImageResource(R.drawable.indbutton1nosl);
            }
            // toggle the boolean
            isSelected = !isSelected;
            return false;
        }
    });

А этот для других занятий

  movements.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent gestesActivity = new Intent (getApplicationContext(), movements.class);
            startActivity(movementsActivity);
            finish();
        }
    });

TL; DR Как мне продолжить, чтобы сочетание кнопок нажималось, отключались другие, а затем при повторном нажатии я перехожу к другому занятию.

Спасибо за любую помощь :) -Плискин

1 Ответ

0 голосов
/ 04 ноября 2018

Вот как бы я это сделал. Допустим, у вас есть 4 кнопки.

// your class fields
boolean [] alreadyTouched = new boolean[4];

Для каждой из 4 кнопок:

button0.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if(!alreadyTouched[0]){
            setAlreadyTouched(0);
            // one click actions here
        }else{
            // second click's action
        }       


    }
});

Теперь вы создаете приватный метод в своем классе:

private void setAlreadyTouched(int index){
    for (int i = 0; i< alreadyTouched.length; i++)
        alreadyTouched[i] = false;
    if(index != -1)
        alreadyTouched[index] = true;
}

И для сброса вашего логического массива, когда кнопка теряет фокус:

button0.setOnFocusChangeListener(new View.OnFocusChangeListener(){
    @Override
    public void onFocusChange(View view, boolean hasFocus){
        if(!hasFocus)
            setAlreadyTouched(-1);
    }
});

Вы можете сделать то же самое, но с массивом int, если вы хотите более двух кликов с небольшими изменениями. Например:

// your class fields
int[] alreadyTouched = new int[4];

Ваш приватный метод:

private void setAlreadyTouched(int index){
    if(index == -1){
        for (int i = 0; i< alreadyTouched.length; i++)
            alreadyTouched[i]=0;
    }else
        alreadyTouched[index] = alreadyTouched[index] +1 ;
}

Затем просто добавьте несколько if в свои onClickListeners:

button0.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        setAlreadyTouched(0);
        switch(alreadyTouched[0]){            
            case 1:
            // one click actions here
            break:
            case 2:
            // second click's action
            break:
            // ... and so on
            default:
            // action for max number of clicks here.
        }                   
    }
});
...