2015-12-07 3 views
4

В моей активности будет показано окно ShowcaseView, которое добавит в декоративный вид ((ViewGroup) activity.getWindow().getDecorView()).addView(mShowcaseView); , и я хочу определить ключевое событие для обработки чего-либо, поэтому я переопределяю dispatchKeyEvent(), чтобы делать то, что я хотел. но похоже, что метод dispatchKeyEvent() никогда не вызывался, что еще хуже, PhoneWindow.DecorView#dispatchKeyEvent() не вызвали, я не знаю почему, пожалуйста, помогите мне.Зачем использовать метод dispatchKeyEvent?

Спасибо. :)

вот мой ShowcaseView кратко исходный код.

public class ShowcaseView extends FrameLayout { 
    public ShowcaseView(Context context) { 
     super(context); 
     init(context); 
    } 

    public ShowcaseView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(context); 
    } 

    public ShowcaseView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(context); 
    } 

    private void init(Context context) { 
     setWillNotDraw(false); 
     setDescendantFocusability(FOCUS_AFTER_DESCENDANTS); 
     setFocusable(true); 
     setEnabled(true); 
    } 

@Override 
public boolean dispatchKeyEvent(KeyEvent event) { 
    Log.d("Showcase", "dispatchKeyEvent: called"); 
    super.dispatchKeyEvent(event); 
    return executeKeyEvent(event); 
} 

private boolean executeKeyEvent(KeyEvent event) { 
    if (event.getAction() == KeyEvent.ACTION_UP 
      && event.getKeyCode() == KeyEvent.KEYCODE_DPAD_CENTER) { 
     hide(); 
    } 
    return true; 
} 
} 
+0

Никто? Это не должно быть трудным ответом для людей, которые знают платформу. – SuperJMN

ответ

0

По https://developer.android.com/training/keyboard-input/commands.html:

Примечание: При обработке событий клавиатуры с классом KeyEvent и связанных с ними интерфейсов, то следует ожидать, что такие события клавиатуры приходят только с аппаратной клавиатуры. Вы никогда не должны полагаться на получение ключевых событий для любой клавиши по методу мягкого ввода (экранная клавиатура).

Для отправки ключевых событий с экранной клавиатуры вы можете добавить textWatcher в editText.

editText.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

      } 

      @Override 
      public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

      } 

      @Override 
      public void afterTextChanged(Editable editable) { 

      } 
     }); 

Но я не вижу поля ввода в фрагменте кода.

Смежные вопросы