2015-03-15 17 views
5

KeyboardView.OnKeyboardActionListener.onRelease() SDK belgelerine göre, "Tekrar eden tuşlar için, bu yalnızca bir kez çağrılır". Ancak, Android Softkeyboard örneğiyle 'a' anahtarını true olarak ayarlanıp ayarlamam ve onPress(), , onKey() ve onRelease() yöntem çağrılarını günlüğe kaydetmem gerekirse, yinelemeyi beklediğim gibi alıyorum ancak tek bir bas/tekrarla/bırakma dizisi için aşağıdaki günlüğü gözlemliyorum. : dokunmatik cihaz piyasaya sürüldükten ne zamanNeden her key repetition sonra android KeyboardView.OnKeyboardActionListener.onRelease() denir?

I/SoftKeyboard(31467): onPress: 97 
I/SoftKeyboard(31467): onKey: 97 
I/SoftKeyboard(31467): onRelease: 97 
I/SoftKeyboard(31467): onKey: 97 
I/SoftKeyboard(31467): onRelease: 97 
I/SoftKeyboard(31467): onKey: 97 
I/SoftKeyboard(31467): onRelease: 97 
I/SoftKeyboard(31467): onKey: 97 
I/SoftKeyboard(31467): onRelease: 97 
I/SoftKeyboard(31467): onKey: 97 
I/SoftKeyboard(31467): onRelease: 97 

nasıl tam olarak belirleyebilir? Teşekkürler, ben OP değilim rağmen D.

DÜZENLEME (Paul Boddington 30/07/2015 tarafından Edit)

ben de sorunu gösteren eksiksiz bir örnek dahil etmek istedik.

MyActivity

:

public class MyActivity extends Activity { 

    private static final String TAG = "MyActivity"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_my); 
     KeyboardView keyboardView = (KeyboardView) findViewById(R.id.keyboard_view); 
     keyboardView.setKeyboard(new Keyboard(this, R.xml.keyboard)); 
     keyboardView.setOnKeyboardActionListener(new KeyboardView.OnKeyboardActionListener() { 

      @Override 
      public void onPress(int i) { 
       Log.i(TAG, "onPress: " + i); 
      } 

      @Override 
      public void onKey(int i, int[] ints) { 
       Log.i(TAG, "onKey: " + i); 
      } 

      @Override 
      public void onRelease(int i) { 
       Log.i(TAG, "onRelease: " + i); 
      } 

      @Override public void onText(CharSequence charSequence) {} 
      @Override public void swipeLeft() {} 
      @Override public void swipeRight() {} 
      @Override public void swipeDown() {} 
      @Override public void swipeUp() {} 
     }); 
    } 
} 

keyboard.xml:

<?xml version="1.0" encoding="utf-8"?> 
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"> 
    android:layout_height="wrap_content" 
    android:layout_width="match_parent" 
    > 
    <Row 
     android:keyWidth="25%p" 
     android:keyHeight="60dp"> 
     <Key android:codes="0" android:keyLabel="0" android:isRepeatable="true"/> 
     <Key android:codes="1" android:keyLabel="1" /> 
     <Key android:codes="2" android:keyLabel="2" /> 
     <Key android:codes="3" android:keyLabel="3" /> 
    </Row> 
</Keyboard> 

activity_my.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <android.inputmethodservice.KeyboardView 
     android:id="@+id/keyboard_view" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     /> 
</LinearLayout> 
+0

Sanırım anahtarınız tekrarlanan değil ... – Marcus

+0

Evet, öyle. Orijinal yazıyı açıklığa kavuşturdum. – davhoo

+1

Stok Android klavyesini kullanıyor musunuz? – Zerp

cevap

1

düzgün tekrarlanabilir tuşlar için onRelease() yayacak şekilde KeyboardView düzeltmek için nasıl çözemedim. Bunun yerine, MotionEvent.ACTION_UP'a bakarak serbest bırakmayı tanıyan bir geçici çözüm buldum. Bunu yalnızca tekrarlanabilir tuşlar için yapın ve bu tuşlar için onRelease() olaylarını da dikkate almayın.

private List<Integer> mRepeatableKeys = new ArrayList<Integer>(); 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    final KeyboardView keyboardView = (KeyboardView) findViewById(R.id.keyboard_view); 
    keyboardView.post(new Runnable() { 
     @Override 
     public void run() { 
      for(Keyboard.Key key : keyboardView.getKeyboard().getKeys()) 
      { 
       if(key.repeatable) mRepeatableKeys.add(key.codes[0]); 
      } 
     } 
    }); 
    keyboardView.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (event.getAction() == MotionEvent.ACTION_UP) { 
       if(mTrackingRepeatableKey != -1) 
       { 
        Log.i(TAG, "Repeatable key released: " + mTrackingRepeatableKey); 
        mTrackingRepeatableKey = -1; 
       } 
      } 
      return false; 
     } 
    }); 

    keyboardView.setKeyboard(new Keyboard(this, R.xml.keyboard)); 
    keyboardView.setOnKeyboardActionListener(mKeyboardActionListener); 
} 

private int mTrackingRepeatableKey = -1; 
KeyboardView.OnKeyboardActionListener mKeyboardActionListener = new KeyboardView.OnKeyboardActionListener() { 

    @Override 
    public void onPress(int i) { 
     Log.i(TAG, "onPress: " + i); 
     if(mRepeatableKeys.contains(i)) 
     { 
      mTrackingRepeatableKey = i; 
     } 
    } 

    @Override 
    public void onKey(int i, int[] ints) { 
     if(mRepeatableKeys.contains(i)) 
     { 
      Log.i(TAG, "onKey Repeat: " + i); 
      return; 
     } 
     Log.i(TAG, "onKey: " + i); 
    } 

    @Override 
    public void onRelease(int i) { 
     // Ignore release for repeatable keys 
     if(mRepeatableKeys.contains(i)) return; 
     Log.i(TAG, "onRelease: " + i); 
    } 

    @Override 
    public void onText(CharSequence text) { 
    } 

    @Override 
    public void swipeLeft() { 
    } 

    @Override 
    public void swipeRight() { 
    } 

    @Override 
    public void swipeDown() { 
    } 

    @Override 
    public void swipeUp() { 
    } 
}; 

Android'de test edilmiştir 5.1. Kayıtlar şimdi okuyun:

I/MainActivity﹕ onPress: 1 
I/MainActivity﹕ onKey Repeat: 1 
I/MainActivity﹕ onKey Repeat: 1 
I/MainActivity﹕ onKey Repeat: 1 
I/MainActivity﹕ onKey Repeat: 1 
I/MainActivity﹕ onKey Repeat: 1 
I/MainActivity﹕ onKey Repeat: 1 
I/MainActivity﹕ onKey Repeat: 1 
I/MainActivity﹕ onKey Repeat: 1 
I/MainActivity﹕ Repeatable key released: 1 

Eğer KeyboardView uzanabilir istiyoruz ve bunun içinde bu çirkin mantığın tüm içeriyorsa.

+0

Harika cevap. İyi bir çözüm için ödül verdim. Teşekkür ederim. Bir hata raporu hazırladım https://code.google.com/p/android/issues/detail?id=181675 –

0

Çok fazla Android programlama yapmıyorum, ancak onLongPress yöntemini kullanarak onRelease yönteminde anahtarın hala basılıp basılmadığını kontrol etmek kolay olmaz mı?

@Override 
public void onRelease(int i) { 
    if(keyboardView.onLongPress(i){ 
     //do nothing 
    } 
    else{ 
     Log.i(TAG, "onRelease: " + i); 
    } 
} 

Yanılmıyorsam durursanda parmağınızı anahtar ve yanlış hala ise, bu yöntem gerçek dönmelidir.

+1

onLongPress() korumalı bir geri arama yöntemidir, siz bunu açıkça belirtmek istemiyorsunuz. –

+0

Ah evet, göründüğü bir çözüm bulmak için acele ettim. – Catch44