2016-12-26 59 views
1

我來自javascript背景,這是我第一次使用java。我一直在關注this guide。我有一個完全可用的鍵盤,現在我想開始定製它。我想要做的第一件事是按下按鍵時顯示符號。如何調用setInputView方法渲染不同的鍵盤

經過挖掘它看起來像setInputView可能是我需要的,但我不知道如何調用它?有一個switch語句控制着我認爲可以掛鉤的符號的外殼,但是當我調用方法時,我得到錯誤Attempt to invoke interface method 'void android.inputmethodservice.KeyboardView$OnKeyboardActionListener.onPress(int)' on a null object reference,我認爲這是因爲我想打電話的功能,我不是實際上呼叫。

以下是相關的Java代碼我到目前爲止有:

包com.example.crhistian.spanishsymbolskeyboard;

import android.inputmethodservice.InputMethodService; 
import android.inputmethodservice.KeyboardView; 
import android.inputmethodservice.Keyboard; 
import android.view.View; 
import android.view.inputmethod.InputConnection; 
import android.view.KeyEvent; 
import android.media.AudioManager; 
public class SpanishSymbols extends InputMethodService 
    implements KeyboardView.OnKeyboardActionListener{ 

private KeyboardView kv; 
private Keyboard keyboard; 
private KeyboardView spanishkv; 

private boolean caps = false; 

@Override 
public void onKey(int primaryCode, int[] keyCodes) { 
    InputConnection ic = getCurrentInputConnection(); 
    playClick(primaryCode); 
    switch(primaryCode){ 
     case Keyboard.KEYCODE_DELETE : 
      ic.deleteSurroundingText(1, 0); 
      break; 
     case Keyboard.KEYCODE_MODE_CHANGE : 
      setInputView(spanishkv); 
      break; 
     case Keyboard.KEYCODE_SHIFT: 
      caps = !caps; 
      keyboard.setShifted(caps); 
      kv.invalidateAllKeys(); 
      break; 
     case Keyboard.KEYCODE_DONE: 
      ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER)); 
      break; 
     default: 
      char code = (char)primaryCode; 
      if(Character.isLetter(code) && caps){ 
       code = Character.toUpperCase(code); 
      } 
      ic.commitText(String.valueOf(code),1); 
    } 
} 

@Override 
public void onPress(int primaryCode) { 
} 

@Override 
public void onRelease(int primaryCode) { 
} 

@Override 
public void onText(CharSequence text) { 
} 

@Override 
public void swipeDown() { 
} 

@Override 
public void swipeLeft() { 
} 

@Override 
public void swipeRight() { 
} 

@Override 
public void swipeUp() { 
} 

@Override 
public View onCreateInputView() { 
    kv = (KeyboardView)getLayoutInflater().inflate(R.layout.keyboard, null); 
    keyboard = new Keyboard(this, R.xml.keyboard); 
    spanishkv = (KeyboardView)getLayoutInflater().inflate(R.layout.spanishsymbols, null); 
    spanishkv.setKeyboard(keyboard); 
    kv.setKeyboard(keyboard); 
    kv.setOnKeyboardActionListener(this); 
    return kv; 
} 

private void playClick(int keyCode){ 
    AudioManager am = (AudioManager)getSystemService(AUDIO_SERVICE); 
    switch(keyCode){ 
     case 32: 
      am.playSoundEffect(AudioManager.FX_KEYPRESS_SPACEBAR); 
      break; 
     case Keyboard.KEYCODE_DONE: 
     case 10: 
      am.playSoundEffect(AudioManager.FX_KEYPRESS_RETURN); 
      break; 
     case Keyboard.KEYCODE_DELETE: 
      am.playSoundEffect(AudioManager.FX_KEYPRESS_DELETE); 
      break; 
     default: am.playSoundEffect(AudioManager.FX_KEYPRESS_STANDARD); 
    } 
} 

}

+0

在這行越來越問題? –

+0

at this line'case Keyboard.KEYCODE_MODE_CHANGE: setInputView(spanishkv);'我知道它是因爲我試圖調用setInputView錯誤,但我不知道如何正確執行它 –

回答

1

您需要設置監聽西班牙鍵盤上,像

spanishKv.setOnKeyboardActionListener(this);