2012-03-19 2 views
6

В настоящее время я работаю над созданием пользовательского приложения для клавиатуры, которое будет оптимизировано для устройства с использованием DPad в качестве основного устройства ввода.Пользовательская клавиатура Focus Focus No

Моя проблема заключается в том, что когда курсор находится в поле EditText и вы нажимаете вниз (например, KEYCODE_DPAD_DOWN), клавиатура не получает фокус и KeyEvents. Ничего не происходит, или элемент под редактируемым текстом получает фокус.

Ниже приведен соответствующий код.

Любая помощь будет высоко оценена. Я попытался проанализировать пример SoftKeyboard, а также KeyboardView.java для подсказок без успеха.

Спасибо, Bryan

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

Ключевые события должны быть пр обрабатывается вручную в методе 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. –

+1

@BryanStern Привет, Брайан, не могли бы вы сообщить мне, какие изменения требуются в InputMethodService, чтобы передать фокус на клавиши? Спасибо – CodeFury

+0

@Sree Вы нашли решение? –