2013-07-03 2 views
3

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

здесь расположение 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 для каждого из них отдельно?

+0

Привет, вы должны принять ответ, нажав 'V' на их слева. –

ответ

6

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

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); 

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

+0

В XML нет тега onLongClick, поэтому я могу просто установить его программно. Спасибо за ваш ответ, и мне очень нравится идея @AndyRes о сохранении всех идентификаторов в первую очередь и установка всего обработчика по циклу. – Massih

+0

Owwww, хорошо, отлично. Никогда не пытались реализовать 'onLongClick' по XML, так что не знали этого. Переход к редактированию ответа. –

+1

Кроме того, лучше упомянуть, что ** опция longClickable ** должна иметь значение ** true ** для каждой кнопки в файле XML. – Massih

1

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

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

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

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

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

Как это:

// 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; 
    } 
}; 
+0

Ваша идея сначала хранить идентификаторы, а затем использовать их над циклом, делая код более понятным и понятным. – Massih

0

если ваши кнопки в 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:[email protected]+id/IdOfLinearLayout"....> 
    <Button 
     android:id="@+id/button1" 
     android:layout_width=... 
     android:layout_height=... 
    .../> 
    <Button 
     android:id="@+id/button2" 
     ... /> 
    .... 
    <Button 
     android:id="@+id/buttonN" 
     .../> 
</LinearLayout> 
Смежные вопросы