Слушатель onLongClick для группы кнопок в Android

В моем приложении для Android я хочу создать фрагмент, который работает как клавиатура. У меня есть одна функция, которая обрабатывает onClick для всех 9 клавиш. Я хочу знать, можно ли в любом случае написать только одну функцию для обработки onLongClick для всех этих 9 клавиш.

вот макет xml:

   <Button
    android:id="@id/testButton"
    android:layout_width="70dp"
    android:layout_height="55dp"
    android:layout_margin="2dp"
    android:background="@drawable/keypad_round_button"
    android:text="1"
    android:textColor="@color/black_1" 
    android:onClick="keypadSetNote"
    android:longClickable="true"/>
<Button
    android:id="@id/testButton"
    android:layout_width="70dp"
    android:layout_height="55dp"
    android:layout_margin="2dp"
    android:background="@drawable/keypad_round_button"
    android:text="2"
    android:longClickable="true"
    android:textColor="@color/black_1"
    android:onClick="keypadSetNote"
     />

Вот прослушиватель OnlongClick:

        Button button = (Button) findViewById(R.id.testButton);
    button.setOnLongClickListener(new View.OnLongClickListener() {
        public boolean onLongClick(View v) {
            Button clickedButton = (Button) v;
            String buttonText = clickedButton.getText().toString();
            Log.v(TAG, "button long pressed --> " + buttonText);
            return true;
        }
    });

Я дал всем ключам один и тот же идентификатор для обработки всех действий onLongClick в одной функции, но это работает только для первого ключа. Есть ли способ определить что-то вроде групповой кнопки в Android ??? Или мне нужно написать прослушиватель OnLongClick для всех из них отдельно???


person Massih    schedule 03.07.2013    source источник
comment
Привет, вы должны принять ответ, нажав V слева от них.   -  person Jorge Fuentes González    schedule 03.07.2013


Ответы (3)


Просто создайте именованную функцию вместо анонимной:

View.OnLongClickListener listener = new View.OnLongClickListener() {
    public boolean onLongClick(View v) {
        Button clickedButton = (Button) v;
        String buttonText = clickedButton.getText().toString();
        Log.v(TAG, "button long pressed --> " + buttonText);
        return true;
    }
};

button1.setOnLongClickListener(listener);
button2.setOnLongClickListener(listener);
button3.setOnLongClickListener(listener);

И хотя вы об этом не спрашивали, мы должны вас предупредить: как говорит @AndyRes, ваши кнопки должны иметь разные идентификаторы. Наличие одного и того же идентификатора не означает, что получение кнопки по идентификатору вернет все кнопки, будет возвращена только первая кнопка с этим идентификатором, потому что она работает только с первой кнопкой.

person Jorge Fuentes González    schedule 03.07.2013
comment
В XML нет тега onLongClick, поэтому я просто могу установить его программно. Спасибо за ваш ответ, и мне очень нравится идея @AndyRes о том, чтобы сначала сохранить все идентификаторы и установить все обработчики в цикле. - person Massih; 03.07.2013
comment
Ооооооооооооооооооооооооооооооооооооооооооооооочень хорошо. Никогда не пытался реализовать onLongClick с помощью XML, поэтому не знал об этом. Собираюсь отредактировать ответ. - person Jorge Fuentes González; 04.07.2013
comment
Кроме того, лучше упомянуть, что для параметра longClickable должно быть установлено значение true для каждой кнопки в их XML-файле. - person Massih; 04.07.2013

Кнопки должны иметь разные идентификаторы:

 <Button
    android:id="@id/testButton1"
    //... />

 <Button
    android:id="@id/testButton2"
    //... />

 <Button
    android:id="@id/testButton3"
    //... />

Теперь, чтобы установить прослушиватель для всех, решением было бы получить id всех кнопок в массиве, а затем использовать цикл for для установки прослушивателя для каждой.

Так:

// Store the id of buttons in an array
int[] ids={R.id.testButton1, R.id.testButton2,R.id.testButton3};

// loop through the array, find the button with respective id and set the listener    
for(int i=0; i<ids.length; i++){
  Button button = (Button) findViewById(ids[i]);
  button.setOnLongClickListener(longClickListener);
}

View.OnLongClickListener longClickListener = new View.OnLongClickListener() {
    public boolean onLongClick(View v) {
        // .....
        return true;
    }
};
person Andy Res    schedule 03.07.2013
comment
Ваша идея о том, чтобы сначала хранить идентификаторы, а затем использовать их в цикле, делает код чище и читабельнее. - person Massih; 03.07.2013

если ваши кнопки находятся в LinearLayout, в RelativeLayour или в другом. И у вас очень много кнопок.

    View.OnLongClickListener listener = new View.OnLongClickListener() {
        public boolean onLongClick(View v) {
            Log.d("ID", ""+v.getId());
            switch (v.getId())
            {
            case R.id.button1:
                //do something for button1
                break;
            case R.id.button2:
                //do something for button2
                break;
            ...
            }
            return true;
        }
    };


    LinearLayout layout=(LinearLayout)findViewById(R.id.IdOfLinearLayout);
    for(int i=0;i<layout.getChildCount();i++){
          layout.getChildAt(i).setOnLongClickListener(listener);
      }

xml файл например...

<LinearLayout 
    android:id=@+id/IdOfLinearLayout"....>
    <Button
       android:id="@+id/button1"
       android:layout_width=...
       android:layout_height=...
    .../>
    <Button
       android:id="@+id/button2"
       ... />
     ....
    <Button
       android:id="@+id/buttonN"
       .../>
</LinearLayout>
person Kiryl Belasheuski    schedule 03.11.2013