如何在edittext关注时显示软键盘
我想在EditText
被聚焦的时候自动显示软键盘(如果设备没有物理键盘),我有两个问题:
-
当我的
Activity
显示,我的EditText
被聚焦,但键盘不显示,我需要再次点击它显示键盘(应显示当我的Activity
显示)。 -
而当我点击键盘完成时,键盘是dississed,但
EditText
保持专注,并不想(因为我的编辑完成)。
为了恢复,我的问题是在iPhone上有更多的东西:保持键盘与我的EditText
状态同步(聚焦/不聚焦),当然如果有物理键盘则不会显示软键盘。
要强制显示软键盘,可以使用
EditText yourEditText= (EditText) findViewById(R.id.yourEditText); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);
而为了消除EditText
的重点,可悲的是你需要有一个虚拟的View
来抓住焦点。
我希望这有帮助
要closures它,你可以使用
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(yourEditText.getWindowToken(), 0);
我有同样的问题。 在editText VISIBILITY从GONE变为VISIBLE之后,我不得不设置焦点并显示软键盘。 我用下面的代码实现了这个function:
new Handler().postDelayed(new Runnable() { public void run() { // ((EditText) findViewById(R.id.et_find)).requestFocus(); // EditText yourEditText= (EditText) findViewById(R.id.et_find); // InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); // imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT); yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0)); yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0)); } }, 200);
它适用于我100毫秒的延迟,但没有任何延迟或只有1毫秒的延迟失败。
部分代码的评论显示了另一种方法,仅适用于某些设备。 我在操作系统版本2.2(仿真器),2.2.1(真实设备)和1.6(仿真器)上testing。
这种方法救了我很多痛苦。
要使键盘出现,请使用
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
这个方法比直接调用InputMethodManager更可靠。
closures它,使用
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
下面的代码被Google 4.1的SearchView源代码掠夺。 似乎工作,罚款在Android的较小版本以及。
private Runnable mShowImeRunnable = new Runnable() { public void run() { InputMethodManager imm = (InputMethodManager) getContext() .getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null) { imm.showSoftInput(editText, 0); } } }; private void setImeVisibility(final boolean visible) { if (visible) { post(mShowImeRunnable); } else { removeCallbacks(mShowImeRunnable); InputMethodManager imm = (InputMethodManager) getContext() .getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null) { imm.hideSoftInputFromWindow(getWindowToken(), 0); } } }
另外,在创buildControl / Activity时需要添加以下代码。 (在我的情况下,这是一个复合控制,而不是一个活动)。
this.editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { public void onFocusChange(View v, boolean hasFocus) { setImeVisibility(hasFocus); } });
当没有其他的工作,强迫它显示:
editText.requestFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
android:windowSoftInputMode="stateAlwaysVisible"
– >在清单文件。
edittext.requestFocus();
– >在代码中。
这将打开活动出现时编辑文本请求焦点的软键盘。
下面的代码在一些简单的情况下我已经有了一些运气。 我还没有完成所有的testing,但….
EditText input = (EditText) findViewById(R.id.Input); input.requestFocus(); input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0)); input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));
并presto键盘显示出来。
你可以尝试强制软键盘出现,它适用于我:
... dialog.show(); input.requestFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
有时候raukodraug的答案将不起作用。 我用这种方式做了一些试验和错误:
public static void showKeyboard(Activity activity) { if (activity != null) { activity.getWindow() .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } } public static void hideKeyboard(Activity activity) { if (activity != null) { activity.getWindow() .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); } }
和EditText部分:
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { hideKeyboard(getActivity()); } else { showKeyboard(getActivity()); } } });
showSoftInput
根本不适合我。
我想我需要设置input模式:(这里在清单中的活动组件)
android:windowSoftInputMode="stateVisible"
我在这里结合了一切,对我来说它是有效的:
public static void showKeyboardWithFocus(View v, Activity a) { try { v.requestFocus(); InputMethodManager imm = (InputMethodManager) a.getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT); a.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); } catch (Exception e) { e.printStackTrace(); } }
当我发现活动animation可以禁用软键盘时,相信与软键盘的问题是否解决。 当你打电话的意图
i.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
和
overridePendingTransition(0, 0);
它可以隐藏软键盘,没有办法显示它。
我在各种不同的情况下都遇到了同样的问题,我find了一些解决scheme,但是在别人那里工作,所以这里是一个联合解决scheme,适用于大多数情况下,我发现:
public static void showVirtualKeyboard(Context context, final View view) { if (context != null) { final InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); view.clearFocus(); if(view.isShown()) { imm.showSoftInput(view, 0); view.requestFocus(); } else { view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { @Override public void onViewAttachedToWindow(View v) { view.post(new Runnable() { @Override public void run() { view.requestFocus(); imm.showSoftInput(view, 0); } }); view.removeOnAttachStateChangeListener(this); } @Override public void onViewDetachedFromWindow(View v) { view.removeOnAttachStateChangeListener(this); } }); } } }
要隐藏键盘,请使用以下命令:
getActivity().getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
并显示键盘:
getActivity().getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
对于片段,确保其工作:
displayName = (EditText) view.findViewById(R.id.displayName); InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
它为我工作。 你也可以尝试用这个来显示键盘:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
final InputMethodManager keyboard = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE); keyboard.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
代码片段。 。 。
public void hideKeyboard(Context activityContext){ InputMethodManager imm = (InputMethodManager) activityContext.getSystemService(Context.INPUT_METHOD_SERVICE); //android.R.id.content ( http://stackoverflow.com/a/12887919/2077479 ) View rootView = ((Activity) activityContext) .findViewById(android.R.id.content).getRootView(); imm.hideSoftInputFromWindow(rootView.getWindowToken(), 0); } public void showKeyboard(Context activityContext, final EditText editText){ final InputMethodManager imm = (InputMethodManager) activityContext.getSystemService(Context.INPUT_METHOD_SERVICE); if (!editText.hasFocus()) { editText.requestFocus(); } editText.post(new Runnable() { @Override public void run() { imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED); } }); }
editText.post(new Runnable() { @Override public void run() { InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT); } });
只需在清单文件中添加android:windowSoftInputMode =“stateHidden”…
上面给出的所有解决scheme( InputMethodManager交互在OnFocusChangeListener.onFocusChange监听器附加到您的EditText工作正常,如果您有单一编辑的活动。
在我的情况下,我有两个编辑。
private EditText tvX, tvY; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); tvX.setOnFocusChangeListener(this); tvY.setOnFocusChangeListener(this); @Override public void onFocusChange(View v, boolean hasFocus) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if(tvX.hasFocus() || tvY.hasFocus()) { imm.showSoftInput(v, 0); } else { imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } };
我观察到,onFocusChange触发了hasFocus = true(键盘显示)的tvX,但随后hasFocus = true(键盘隐藏)的tvY触发。 最后,没有键盘可见。
一般的解决scheme应该有正确的说法,如果“显示键盘如果EditText文本有焦点”
在Activity的onResume()部分,你可以调用方法bringKeyboard();
onResume() { EditText yourEditText= (EditText) findViewById(R.id.yourEditText); bringKeyboard(yourEditText); } protected boolean bringKeyboard(EditText view) { if (view == null) { return false; } try { // Depending if edittext has some pre-filled values you can decide whether to bring up soft keyboard or not String value = view.getText().toString(); if (value == null) { InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(view.getWindowToken(), 0); return true; } } catch (Exception e) { Log.e(TAG, "decideFocus. Exception", e); } return false; }
在你的清单里面:
android:windowSoftInputMode="stateAlwaysVisible"
– 最初启动的键盘。 android:windowSoftInputMode="stateAlwaysHidden"
– 最初隐藏的键盘。
我也喜欢使用"adjustPan"
因为当键盘启动然后屏幕自动调整。
<activity android:name="YourActivity" android:windowSoftInputMode="stateAlwaysHidden|adjustPan"/>
我发现了一个奇怪的行为,因为在我的一个应用程序中,软键盘在进入活动时自动显示(onCreate中有一个editText.requestFocus())。
在进一步的挖掘中,我发现这是因为在布局周围有一个ScrollView。 如果我删除了ScrollView,其行为如原始问题描述中所述:只有在单击已经聚焦的editText时,软键盘才显示出来。
如果它不适合你,请尝试放入一个滚动视图 – 无论如何这是无害的。
我有使用视图animation类似的问题 。 所以我把一个animation监听器,以确保我要等待animation结束,然后试图请求显示的编辑文本的键盘访问。
bottomUp.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { if (textToFocus != null) { // Position cursor at the end of the text textToFocus.setSelection(textToFocus.getText().length()); // Show keyboard InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(textToFocus, InputMethodManager.SHOW_IMPLICIT); } } @Override public void onAnimationRepeat(Animation animation) { } });
我同意使用swithview中的raukodraug,你必须像这样请求/清除焦点:
final ViewSwitcher viewSwitcher = (ViewSwitcher) findViewById(R.id.viewSwitcher); final View btn = viewSwitcher.findViewById(R.id.address_btn); final View title = viewSwitcher.findViewById(R.id.address_value); title.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { viewSwitcher.showPrevious(); btn.requestFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(btn, InputMethodManager.SHOW_IMPLICIT); } }); // EditText affiche le titre evenement click btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { btn.clearFocus(); viewSwitcher.showNext(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(btn.getWindowToken(), 0); // Enregistre l'adresse. addAddress(view); } });
问候。
使用Xamarin,这在我的片段内工作:
using Android.Views.InputMethods; using Android.Content; ... if ( _txtSearch.RequestFocus() ) { var inputManager = (InputMethodManager) Activity.GetSystemService( Context.InputMethodService ); inputManager.ShowSoftInput( _txtSearch, ShowFlags.Implicit ); }
我做了这个帮助class。 只要传递上下文和想要关注的视图并显示键盘,然后隐藏键盘。 我希望它帮助。
public class FocusKeyboardHelper { private View view; private Context context; private InputMethodManager imm; public FocusKeyboardHelper(Context context, View view){ this.view = view; this.context = context; imm = (InputMethodManager) context.getSystemService(context.INPUT_METHOD_SERVICE); } public void focusAndShowKeyboard(){ view.requestFocus(); imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY); } public void hideKeyBoard(){ imm.hideSoftInputFromWindow(view.getWindowToken(), 0); }
}
void requestFocus(View editText, Activity activity) { try { editText.requestFocus(); InputMethodManager imm = (InputMethodManager) a.getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT); activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); } catch (Exception e) { e.printStackTrace(); } }
加这一行也别忘了
activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
您还可以创build一个EditText的自定义扩展,知道在接收焦点时打开软键盘。 这就是我最终做的。 以下是对我有用的东西:
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; } }