2012-03-19 105 views
6

我目前正在开发,将为使用DPAD作为其主要输入设备的设备进行优化的自定义键盘的应用程序。定制的Android键盘焦点问题

我的问题是当光标在的EditText字段和你按下(例如KEYCODE_DPAD_DOWN),键盘视图不接收焦点和的KeyEvent。要么没有任何事情发生,或者所涉及的EditText下的元素获得焦点。

下面是相关的代码。

任何帮助将不胜感激。我试过藏汉解剖SoftKeyboard例如作为KeyboardView.java对于没有成功的提示。

感谢, 布莱恩

MyKeyboard.java

public class MyKeyboard extends InputMethodService { 

    private static final String TAG = "MyKeyboard"; 
    private MyKeyboardView mInputView = null; 

    @Override public void onCreate() { 
     super.onCreate(); 
    } 

    @Override public View onCreateInputView() { 
     mInputView = (MyKeyboardView) getLayoutInflater().inflate(R.layout.input, null); 

     // attempts to make this focusable 
     mInputView.setClickable(true); 
     mInputView.setFocusableInTouchMode(true); 
     mInputView.setFocusable(true); 
     mInputView.setEnabled(true); 

     return mInputView; 
    } 

    @Override public View onCreateCandidatesView() { 
     super.onCreateCandidatesView(); 
     return null; 
    } 

    @Override public void onStartInputView(EditorInfo info, boolean restarting) { 
     super.onStartCandidatesView(info, restarting); 
    } 

    @Override public void onFinishInput() { 
     super.onFinishInput(); 
    } 

    @Override public void onDestroy() { 
     super.onDestroy(); 
    } 
} 

MyKeyboardView.java

public class MyKeyboardView extends TableLayout implements View.OnClickListener, View.OnFocusChangeListener { 

    private static final String TAG = "MyKeyboardView"; 
    private ArrayList<Character> charList = new ArrayList<Character>(); 

    public MyKeyboardView(Context context) { 
     super(context); 

     populateKeyboard(); 
     this.setOnFocusChangeListener(this); 
     this.setOnClickListener(this); 
    } 

    public MyKeyboardView(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     populateKeyboard(); 
     this.setOnFocusChangeListener(this); 
     this.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View arg0) { 
     Log.d(TAG, "onClick"); 
    } 

    private void populateKeyboard() { 
     charList.add(new Character(',')); 
     charList.add(new Character('.')); 
     charList.add(new Character('?')); 
     charList.add(new Character('<')); 
     charList.add(new Character('>')); 
     charList.add(new Character((char) 0x2798)); // arrow 
     charList.add(new Character((char) 0x2798)); // arrow 
     charList.add(new Character((char) 0x2798)); // arrow 
     charList.add(new Character((char) 0x005F)); // underscore 
     for(char c = '@'; c < 'Z'; c++) { 
      charList.add(new Character(c)); 
      Log.d(TAG, "char: " + c); 
     } 


     TableRow tr = null; 
     for(int i=0; i<charList.size(); i++) { 
      if(i % 7 == 0) { 
       if(tr != null) 
        this.addView(tr); 
       tr = new TableRow(this.getContext()); 
       tr.setGravity(Gravity.CENTER_HORIZONTAL); 
      } 
      TextView tv = new TextView(this.getContext()); 
      tv.setPadding(21, 2, 21, 2); 
      tv.setText(charList.get(i).toString()); 
      tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 22); 
      tv.setTextColor(Color.WHITE); 
      tv.setGravity(Gravity.CENTER); 
      tv.setFocusable(true); 
      tv.setEnabled(true); 

      tr.addView(tv); 
     } 
     if(tr.getChildCount() > 0) 
      this.addView(tr); 
    } 

    @Override 
    public void onFocusChange(View v, boolean hasFocus) { 
     Log.d(TAG, "mInputView onFocusChange " + (hasFocus ? "true" : "false")); 
    } 
} 

的input.xml

<?xml version="1.0" encoding="utf-8"?> 
<com.weirdtuesday.mykeyboard.MyKeyboardView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/input" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:background="#FF000000" 
    android:focusable="true" /> 

回答

2

关键事件必须是PR在onKey方法中手动插入。要移动光标,我使用这个:

if (primaryCode == KeyEvent.KEYCODE_DPAD_RIGHT) { 
     int position = connection.getTextBeforeCursor(Integer.MAX_VALUE, 0) 
       .length(); 
     final CharSequence selected = connection.getSelectedText(0); 
     if (selected != null) 
      connection.commitText(
        mComposing.substring(0, 
          mComposing.length() - selected.length()), 1); 
     else 
      connection.commitText(mComposing, 1); 
     connection.setSelection(position + 1, position + 1); 
    } 
+0

我刚刚在前些天看到了这个!谢谢!为了澄清,这属于InputMethodService的子类。 – 2012-04-09 18:32:48

+1

@BryanStern嗨布莱恩,你可以让我知道了什么变化所需的InputMethodService通过重点钥匙?由于 – CodeFury 2014-04-04 10:02:56

+0

@Sree你找到任何解决方案? – 2016-06-14 09:54:16