2013-04-23 16 views
9

Utworzyłem niestandardową klawiaturę za pomocą Klasy klawiatury Android.Ustaw tryb klawiatury w niestandardowej klawiaturze Androida

Chcę mieć wiersze dla dwóch trybów. Jednym z nich jest tryb normalny. A jednym jest, gdy użytkownik naciśnie przycisk "Sym". Dla każdego Keyboard.Row dla przycisku "Sym" w XML mam określone android: keyboardMode = "@ + id/sym".

Teraz, gdy uruchomię to tylko wiersze, które nie określają android: wyświetlanie klawiatury. Jest to zgodne z oczekiwaniami i tym, co mówi dokumentacja.

Moje pytanie brzmi: jak ustawić tryb w moim kodzie, aby wiersze z androidem: keyboardMode = "@ + id/sym" były renderowane?

<Row> 
    <Key android:codes="113" android:keyLabel="q" /> 
    <Key android:codes="119" android:keyLabel="w" /> 
    <Key android:codes="101" android:keyLabel="e" /> 
    <Key android:codes="114" android:keyLabel="r" /> 
    <Key android:codes="116" android:keyLabel="t" /> 
    <Key android:codes="121" android:keyLabel="y" /> 
    <Key android:codes="117" android:keyLabel="u" /> 
    <Key android:codes="105" android:keyLabel="i" /> 
    <Key android:codes="111" android:keyLabel="o" /> 
    <Key android:codes="112" android:keyLabel="p" /> 
    <Key android:codes="-5" android:keyIcon="@drawable/keyboard_backspace_icon" android:keyWidth="91dp" /> 
</Row> 
<Row android:keyboardMode="@+id/sym"> 
    <Key android:codes="113" android:keyLabel="+" /> 
    <Key android:codes="119" android:keyLabel="_" /> 
    <Key android:codes="101" android:keyLabel="=" /> 
    <Key android:codes="114" android:keyLabel="%" /> 
    <Key android:codes="116" android:keyLabel="^" /> 
    <Key android:codes="121" android:keyLabel="|" /> 
    <Key android:codes="117" android:keyLabel="&lt;" /> 
    <Key android:codes="105" android:keyLabel=">" /> 
    <Key android:codes="111" android:keyLabel="[" /> 
    <Key android:codes="112" android:keyLabel="]" /> 
    <Key android:codes="-5" android:keyIcon="@drawable/keyboard_backspace_icon" android:keyWidth="91dp" /> 
</Row> 

Odpowiedz

15

Ok sam to wymyśliłem.

Nie ma metody, aby po prostu przełączać tryby klawiatury. Musisz utworzyć dwie różne klawiatury i przełączać się między nimi ręcznie.

Oto, jak wygląda zaktualizowany plik XML. Zauważ, że wiersze, których chcesz użyć w obu słowach kluczowych, nie powinny zawierać flagi android: keyboardMode.

<!-- this is the row that shows in both modes --> 
<Row android:keyWidth="51dp"> 
    <Key android:codes="49" android:keyLabel="1" /> 
    <Key android:codes="50" android:keyLabel="2" /> 
    <Key android:codes="51" android:keyLabel="3" /> 
    <Key android:codes="52" android:keyLabel="4" /> 
    <Key android:codes="53" android:keyLabel="5" /> 
    <Key android:codes="54" android:keyLabel="6" /> 
    <Key android:codes="55" android:keyLabel="7" /> 
    <Key android:codes="56" android:keyLabel="8" /> 
    <Key android:codes="57" android:keyLabel="9" /> 
    <Key android:codes="48" android:keyLabel="0"/>   
</Row> 

<!-- this is the normal mode --> 
<Row android:keyboardMode="@integer/keyboard_normal"> 
    <Key android:codes="113" android:keyLabel="q" /> 
    <Key android:codes="119" android:keyLabel="w" /> 
    <Key android:codes="101" android:keyLabel="e" /> 
    <Key android:codes="114" android:keyLabel="r" /> 
    <Key android:codes="116" android:keyLabel="t" /> 
    <Key android:codes="121" android:keyLabel="y" /> 
    <Key android:codes="117" android:keyLabel="u" /> 
    <Key android:codes="105" android:keyLabel="i" /> 
    <Key android:codes="111" android:keyLabel="o" /> 
    <Key android:codes="112" android:keyLabel="p" /> 
    <Key android:codes="-5" android:keyIcon="@drawable/keyboard_backspace_icon" android:keyWidth="91dp" /> 
</Row> 

<!-- this is the symbol mode--> 
<Row android:keyboardMode="@integer/keyboard_symbol"> 
    <Key android:codes="113" android:keyLabel="+" /> 
    <Key android:codes="119" android:keyLabel="_" /> 
    <Key android:codes="101" android:keyLabel="=" /> 
    <Key android:codes="114" android:keyLabel="%" /> 
    <Key android:codes="116" android:keyLabel="^" /> 
    <Key android:codes="121" android:keyLabel="|" /> 
    <Key android:codes="117" android:keyLabel="&lt;" /> 
    <Key android:codes="105" android:keyLabel=">" /> 
    <Key android:codes="111" android:keyLabel="[" /> 
    <Key android:codes="112" android:keyLabel="]" /> 
    <Key android:codes="-5" android:keyIcon="@drawable/keyboard_backspace_icon" android:keyWidth="91dp" /> 
</Row> 

Następnie utwórz integer.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <integer name="keyboard_symbol">1</integer> 
    <integer name="keyboard_normal">0</integer> 
</resources> 

Oto odpowiedni kod Java. Po utworzeniu obiektu Keyboard przekazujesz parametr keyboard_normal lub keyboard_symbol.

normalKeyBoard = new Keyboard(activity, R.id.board, R.integer.keyboard_normal); 
symbolKeyBoard = new Keyboard(activity, R.id.board, R.integer.keyboard_symbol); 

Teraz utwórz zmienną klasy, aby śledzić tryb. Wartość domyślna to R.integer.keyboard_normal

private int mKeyboardState = R.integer.keyboard_normal; 

Teraz w onKeyboardActionListner(). Metoda onkey umieścić kod do przechwytywania klawisz, który przełącza tryby (zakładając, że stworzył jedną w klawiaturze).

 if(primaryCode== Keyboard.KEYCODE_MODE_CHANGE) { 
      if(mKeyboardView != null) { 
       if(mKeyboardState == R.integer.keyboard_normal){ 
        //change to symbol keyboard 
        if(symbolKeyBoard== null){ 
         symbolKeyBoard = new Keyboard(mHostActivity, R.xml.hexkbd, R.integer.keyboard_symbol); 
        } 

        mKeyboardView.setKeyboard(symbolKeyBoard); 
        mKeyboardState = R.integer.keyboard_symbol; 
       } else { 
        if(normalKeyBoard== null){ 
         normalKeyBoard = new Keyboard(mHostActivity, R.xml.hexkbd, R.integer.keyboard_normal); 
        } 

        mKeyboardView.setKeyboard(normalKeyBoard); 
        mKeyboardState = R.integer.keyboard_normal; 
       } 
       //no shifting 
       mKeyboardView.setShifted(false); 
      } 
     } 
+0

Czy istnieje klucz do uruchomienia kodu KEYCODE_MODE_CHANGE? Nie jestem w stanie go znaleźć. –

Powiązane problemy