下面列出了android.view.KeyEvent#DispatcherState ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@Override
public boolean dispatchKeyEventPreIme(KeyEvent event) {
if (mPromptOptions.getBackButtonDismissEnabled()
&& event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
KeyEvent.DispatcherState state = getKeyDispatcherState();
if (state != null) {
if (event.getAction() == KeyEvent.ACTION_DOWN
&& event.getRepeatCount() == 0) {
state.startTracking(event, this);
return true;
} else if (event.getAction() == KeyEvent.ACTION_UP
&& !event.isCanceled() && state.isTracking(event)) {
if (mPromptTouchedListener != null) {
mPromptTouchedListener.onNonFocalPressed();
}
return mPromptOptions.getAutoDismiss()
|| super.dispatchKeyEventPreIme(event);
}
}
}
return super.dispatchKeyEventPreIme(event);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
// To intercept hardware key, a view must have focus.
if (mDelegate == null) return super.dispatchKeyEvent(event);
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
KeyEvent.DispatcherState state = getKeyDispatcherState();
if (state != null) {
if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) {
state.startTracking(event, this);
return true;
} else if (event.getAction() == KeyEvent.ACTION_UP && !event.isCanceled()
&& state.isTracking(event)) {
onBackPressed();
return true;
}
}
}
return super.dispatchKeyEvent(event);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
// To intercept hardware key, a view must have focus.
if (mDelegate == null) return super.dispatchKeyEvent(event);
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
KeyEvent.DispatcherState state = getKeyDispatcherState();
if (state != null) {
if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) {
state.startTracking(event, this);
return true;
} else if (event.getAction() == KeyEvent.ACTION_UP && !event.isCanceled()
&& state.isTracking(event)) {
onBackPressed();
return true;
}
}
}
return super.dispatchKeyEvent(event);
}
@Override
public boolean onKeyPreIme(int keyCode, @NonNull KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && isSheetShowing()) {
if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) {
KeyEvent.DispatcherState state = getKeyDispatcherState();
if (state != null) {
state.startTracking(event, this);
}
return true;
} else if (event.getAction() == KeyEvent.ACTION_UP) {
KeyEvent.DispatcherState dispatcherState = getKeyDispatcherState();
if (dispatcherState != null) {
dispatcherState.handleUpEvent(event);
}
if (isSheetShowing() && event.isTracking() && !event.isCanceled()) {
if (state == State.EXPANDED && peekOnDismiss) {
peekSheet();
} else {
dismissSheet();
}
return true;
}
}
}
return super.onKeyPreIme(keyCode, event);
}
@Override
public boolean dispatchKeyEventPreIme(KeyEvent event) {
// Intercept the hardware back button press if needed. When it's pressed, we'll collapse.
if (mState.respondsToBackButton() && KeyEvent.KEYCODE_BACK == event.getKeyCode()) {
KeyEvent.DispatcherState state = getKeyDispatcherState();
if (state != null) {
if (KeyEvent.ACTION_DOWN == event.getAction()) {
state.startTracking(event, this);
return true;
} else if (KeyEvent.ACTION_UP == event.getAction()) {
onBackPressed();
return true;
}
}
}
return super.dispatchKeyEventPreIme(event);
}
@Override
public boolean onKeyPreIme(int keyCode, @NonNull KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && isSheetShowing()) {
if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) {
KeyEvent.DispatcherState state = getKeyDispatcherState();
if (state != null) {
state.startTracking(event, this);
}
return true;
} else if (event.getAction() == KeyEvent.ACTION_UP) {
KeyEvent.DispatcherState dispatcherState = getKeyDispatcherState();
if (dispatcherState != null) {
dispatcherState.handleUpEvent(event);
}
if (isSheetShowing() && event.isTracking() && !event.isCanceled()) {
if (state == State.EXPANDED && peekOnDismiss) {
peekSheet();
} else {
dismissSheet();
}
return true;
}
}
}
return super.onKeyPreIme(keyCode, event);
}
/**
* Create a SoftInputWindow that uses a custom style.
*
* @param context The Context in which the DockWindow should run. In
* particular, it uses the window manager and theme from this context
* to present its UI.
* @param theme A style resource describing the theme to use for the window.
* See <a href="{@docRoot}reference/available-resources.html#stylesandthemes">Style
* and Theme Resources</a> for more information about defining and
* using styles. This theme is applied on top of the current theme in
* <var>context</var>. If 0, the default dialog theme will be used.
*/
public SoftInputWindow(Context context, String name, int theme, Callback callback,
KeyEvent.Callback keyEventCallback, KeyEvent.DispatcherState dispatcherState,
int windowType, int gravity, boolean takesFocus) {
super(context, theme);
mName = name;
mCallback = callback;
mKeyEventCallback = keyEventCallback;
mDispatcherState = dispatcherState;
mWindowType = windowType;
mGravity = gravity;
mTakesFocus = takesFocus;
initDockWindow();
}
private boolean onContainerKey(KeyEvent event) {
int keyCode = event.getKeyCode();
if (isInterestingKey(keyCode)) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (event.getAction() == KeyEvent.ACTION_DOWN
&& event.getRepeatCount() == 0) {
if (mOwnerView != null) {
KeyEvent.DispatcherState ds = mOwnerView.getKeyDispatcherState();
if (ds != null) {
ds.startTracking(event, this);
}
}
return true;
} else if (event.getAction() == KeyEvent.ACTION_UP
&& event.isTracking() && !event.isCanceled()) {
setVisible(false);
return true;
}
} else {
dismissControlsDelayed(ZOOM_CONTROLS_TIMEOUT);
}
// Let the container handle the key
return false;
} else {
ViewRootImpl viewRoot = mOwnerView.getViewRootImpl();
if (viewRoot != null) {
viewRoot.dispatchInputEvent(event);
}
// We gave the key to the owner, don't let the container handle this key
return true;
}
}
@Override
public boolean dispatchKeyEventPreIme(KeyEvent event)
{
if (mPromptOptions.getBackButtonDismissEnabled()
&& event.getKeyCode() == KeyEvent.KEYCODE_BACK)
{
KeyEvent.DispatcherState state = getKeyDispatcherState();
if (state != null)
{
if (event.getAction() == KeyEvent.ACTION_DOWN
&& event.getRepeatCount() == 0)
{
state.startTracking(event, this);
return true;
}
else if (event.getAction() == KeyEvent.ACTION_UP
&& !event.isCanceled() && state.isTracking(event))
{
if (mPromptTouchedListener != null)
{
mPromptTouchedListener.onBackButtonPressed();
}
return mPromptOptions.getAutoDismiss()
|| super.dispatchKeyEventPreIme(event);
}
}
}
return super.dispatchKeyEventPreIme(event);
}
@Test
public void testPromptView_BackButton_NotBackKey()
{
final MaterialTapTargetPrompt.PromptView promptView = createPromptView();
promptView.mPromptTouchedListener = new MaterialTapTargetPrompt.PromptView.PromptTouchedListener() {
@Override
public void onFocalPressed()
{
fail();
}
@Override
public void onNonFocalPressed()
{
fail();
}
@Override
public void onBackButtonPressed()
{
fail();
}
};
KeyEvent.DispatcherState state = new KeyEvent.DispatcherState();
when(promptView.getKeyDispatcherState()).thenReturn(state);
final KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BUTTON_1);
assertFalse(promptView.dispatchKeyEventPreIme(event));
}
@Test
public void testPromptView_BackButton_Disabled()
{
final MaterialTapTargetPrompt.PromptView promptView = createPromptView();
promptView.mPromptOptions.setBackButtonDismissEnabled(false);
promptView.mPromptTouchedListener = new MaterialTapTargetPrompt.PromptView.PromptTouchedListener() {
@Override
public void onFocalPressed()
{
fail();
}
@Override
public void onNonFocalPressed()
{
fail();
}
@Override
public void onBackButtonPressed()
{
fail();
}
};
KeyEvent.DispatcherState state = new KeyEvent.DispatcherState();
when(promptView.getKeyDispatcherState()).thenReturn(state);
final KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK);
assertFalse(promptView.dispatchKeyEventPreIme(event));
}
/**
* Return the global {@link KeyEvent.DispatcherState KeyEvent.DispatcherState}
* for used for processing events from the target application.
* Normally you will not need to use this directly, but
* just use the standard high-level event callbacks like {@link #onKeyDown}.
*/
public KeyEvent.DispatcherState getKeyDispatcherState() {
return mDispatcherState;
}