You can also create a custom extension of the EditText that knows to open the soft keyboard when it receives focus. That's what I've ended up doing. Here's what worked for me:
public class WellBehavedEditText extends EditText { private InputMethodManager inputMethodManager; private boolean showKeyboard = false; public WellBehavedEditText(Context context) { super(context); this.initializeWellBehavedEditText(context); } public WellBehavedEditText(Context context, AttributeSet attributes) { super(context, attributes); this.initializeWellBehavedEditText(context); } public WellBehavedEditText(Context context, AttributeSet attributes, int defStyleAttr) { super(context, attributes, defStyleAttr); this.initializeWellBehavedEditText(context); } public WellBehavedEditText(Context context, AttributeSet attributes, int defStyleAttr, int defStyleRes) { super(context, attributes, defStyleAttr, defStyleRes); this.initializeWellBehavedEditText(context); } private void initializeWellBehavedEditText(Context context) { this.inputMethodManager = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); final WellBehavedEditText editText = this; this.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if(showKeyboard) { showKeyboard = !(inputMethodManager.showSoftInput(editText, InputMethodManager.SHOW_FORCED)); } } }); } @Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { if(!focused) this.showKeyboard = false; super.onFocusChanged(focused, direction, previouslyFocusedRect); } @Override public boolean requestFocus(int direction, Rect previouslyFocusedRect) { boolean result = super.requestFocus(direction, previouslyFocusedRect); this.showKeyboard = true; final WellBehavedEditText self = this; this.post(new Runnable() { @Override public void run() { showKeyboard = !(inputMethodManager.showSoftInput(self, InputMethodManager.SHOW_FORCED)); } }); return result; } }