2013-04-23 382 views
9

我已經使用Android鍵盤類創建了自定義鍵盤。在Android自定義鍵盤中設置鍵盤模式

我想要有兩種模式的行。一種是正常模式。一個是當用戶按下「Sym」按鈕時。對於每個Keyboard.Row在XML中的「Sym」按鈕,我已經指定了android:keyboardMode =「@ + id/sym」。

現在,當我運行它只有沒有指定android:keyboardMode顯示的行。這正如預期的那樣以及文檔所述。

我的問題是如何在我的代碼中設置模式,以便android:keyboardMode =「@ + id/sym」的行得到渲染?

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

回答

15

好吧,自己弄明白了。

沒有簡單切換鍵盤模式的方法。你必須做的是創建2個不同的鍵盤並手動切換它們。

下面是更新後的XML的樣子。請注意,您希望在這兩個關鍵字中使用的行不應包含標誌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> 

然後創建一個integer.xml

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

下面是相關的Java代碼。當您創建Keyboard對象時,您將傳遞keyboard_normal或keyboard_symbol。

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

現在創建一個類變量來跟蹤模式。默認值是R.integer.keyboard_normal

private int mKeyboardState = R.integer.keyboard_normal; 

現在,在您onKeyboardActionListner()。安其方法把代碼捕捉切換模式(假設你已經在你的鍵盤創建一個)的關鍵。

 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

是否有一個關鍵代碼來觸發KEYCODE_MODE_CHANGE?我無法找到它。 – 2017-09-14 17:50:30