2016-12-26 10 views
1

私はJavaScriptのバックグラウンドから来ています。これはJavaの最初のブラシです。別のキーボードをレンダリングするためにsetInputViewメソッドを呼び出す方法

私はthis guideに従っています。私は完全に機能しているキーボードを持っており、今はそれをカスタマイズしたいと思っています。私がしたいのは、キーが押されたときにシンボルを表示することです。

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

この行の 'case Keyboard.KEYCODE_MODE_CHANGE: setInputView(spanishkv);'私はsetInputViewを間違って呼び出そうとしているので、そのことを知っていますが、正しく行う方法がわかりません –

答えて

1

あなたはスペイン語のキーボード上のリスナーを設定する必要があり、

spanishKv.setOnKeyboardActionListener(this); 
関連する問題