viernes, 13 de junio de 2014

Android: How to simulate the detection of using finishing input in EditText

On the layout of the activity/fragment that contains the edit text.

Container class Layout:

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
       
        ...

        <View 
            android:id="@+id/focus"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:focusable="true"
            android:focusableInTouchMode="true"/>

        ...

        <com.example.MyEditText
            android:id="@+id/edit_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

        ...
    </LinearLayout>

Container class:

@Override
public void onBackPressed() {

super.onBackPressed();

if (getEditText().hasFocus()) {

doSomething();
}

}

private MyEditText getEditText() {

return (MyEditText) findViewById(R.id.edit_text);
}

...

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {

android.graphics.Rect rect = new android.graphics.Rect();

getEditText().getDrawingRect(rect);

if (getEditText().hasFocus() && !rect.contains((int) ev.getX(), (int) ev.getY())) {

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getEditText().getWindowToken(), 0);

getEditText().clearFocus();

findViewById(R.id.focus).requestFocus();

doSomething();
}

return super.dispatchTouchEvent(ev);
}

...

private void setAdjustmentListener() {

getEditText().setOnKeyboardDismissListener(new OnKeyboardDismissListener() {

@Override
public void onDismiss() {

doSomething();
}
});
}

MyEditText class:

public class MyEditText extends EditText {

private OnKeyboardDismissListener onKeyboardDismissListener;

public interface OnKeyboardDismissListener {

public void onDismiss();
}

public MyEditText(Context context, AttributeSet attrs) {

super(context, attrs);

this.setHintTextColor(context.getResources().getColor(android.R.color.black));

setOnEditorActionListener();
}

private void setOnEditorActionListener() {

this.setOnEditorActionListener(new OnEditorActionListener() {

@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

if (actionId == EditorInfo.IME_ACTION_DONE) {

if (onKeyboardDismissListener != null) {
onKeyboardDismissListener.onDimiss();
}
}

return false;
}
});
}

@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {

if (event.getKeyCode() == KeyEvent.KEYCODE_BACK || event.getKeyCode() == KeyEvent.FLAG_EDITOR_ACTION
|| event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {

if (onKeyboardDismissListener != null) {
onKeyboardDismissListener.onKeyboardDismiss();
}
}
return super.dispatchKeyEvent(event);
}

public OnKeyboardDismissListener getOnKeyboardDismissListener() {

return onKeyboardDismissListener;
}

public void setOnKeyboardDismissListener(OnKeyboardDismissListener onKeyboardDismissListener) {

this.onKeyboardDismissListener = onKeyboardDismissListener;
}


}