I was able to implement onKeyPreIme by sub-classing my EditText views that were related to the keyboard input. The goal is to make a custom lock screen that the user must enter a pass code or leave the application. When the user taps the "keyboard down" button the keyboard does not disappear.
Make sure to create a separate .java file for the subclassed EditText. Additionally, be sure to use the constructor in the code below (must pass AttrubuteSet).
I realize that my implementation of onKeyPreIme may not match yours, however it does demonstrate how to intercept the keyboard events before the InputMethodManager does it's thing.
I hope this helps.
Screenshot UserLockActivity 
EditText Subclass
public class LockEditText extends EditText { /* Must use this constructor in order for the layout files to instantiate the class properly */ public LockEditText(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } @Override public boolean onKeyPreIme (int keyCode, KeyEvent event) { // Return true if I handle the event: // In my case i want the keyboard to not be dismissible so i simply return true // Other people might want to handle the event differently System.out.println("onKeyPreIme " +event); return true; } }
UserLockActivity.java
public class UserLockActivity extends Activity { private LockEditText editText1; private LockEditText editText2; private LockEditText editText3; private LockEditText editText4; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_user_lock); editText1 = (LockEditText) findViewById(R.id.lock_text_1); editText2 = (LockEditText) findViewById(R.id.lock_text_2); editText3 = (LockEditText) findViewById(R.id.lock_text_3); editText4 = (LockEditText) findViewById(R.id.lock_text_4); setupTextChangedListener(editText1); setupTextChangedListener(editText2); setupTextChangedListener(editText3); setupTextChangedListener(editText4); // A method to bring out the keyboard when the view appears setFocusOnEditText(editText1); } public void setFocusOnEditText(LockEditText editText) { editText.clearFocus(); editText.requestFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0); } public void setupTextChangedListener(LockEditText editText) { editText.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable arg0) { // TODO Auto-generated method stub } @Override public void beforeTextChanged(CharSequence arg0, int arg1,int arg2, int arg3) { // TODO Auto-generated method stub } }); } }
activity_user_lock.xml Layout file
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".UserLockActivity" > <TextView android:id="@+id/main_lock_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_alignParentTop="true" android:paddingTop="60dp" android:paddingBottom="20dp" android:text="@string/enter_passcode" android:textAppearance="?android:attr/textAppearanceLarge" /> <LinearLayout android:id="@+id/lock_input_layout" android:layout_width="match_parent" android:layout_height="60dp" android:layout_below="@+id/main_lock_text" android:orientation="horizontal" > <com.yourpackage.yourappname.LockEditText android:id="@+id/lock_text_1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_weight="1" android:ems="10" android:inputType="numberPassword" android:textSize="30sp" android:gravity="center_horizontal" android:textStyle="bold" > </com.yourpackage.yourappname.LockEditText> <com.yourpackage.yourappname.LockEditText android:id="@+id/lock_text_2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_weight="1" android:ems="10" android:inputType="numberPassword" android:textSize="30sp" android:gravity="center_horizontal" android:textStyle="bold" > </com.yourpackage.yourappname.LockEditText> <com.yourpackage.yourappname.LockEditText android:id="@+id/lock_text_3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_weight="1" android:ems="10" android:inputType="numberPassword" android:textSize="30sp" android:gravity="center_horizontal" android:textStyle="bold"> </com.yourpackage.yourappname.LockEditText> <com.yourpackage.yourappname.LockEditText android:id="@+id/lock_text_4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_weight="1" android:ems="10" android:inputType="numberPassword" android:textSize="30sp" android:gravity="center_horizontal" android:textStyle="bold" > </com.yourpackage.yourappname.LockEditText> </LinearLayout> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/lock_input_layout" android:layout_centerHorizontal="true" android:text="text" /> </RelativeLayout>
super.dispatchKeyEvent(event);the activity's back button will work!