私はEditText
がフォーカスされたときに自動的にソフトキーボードを表示したいのですが(デバイスが物理的なキーボードを持っていない場合)、私は二つの問題を抱えています:
Activity
が表示されているとき、私のEditText
はフォーカスされていますが、キーボードは表示されていません。キーボードを表示するには、もう一度クリックする必要があります(Activity
が表示されるときに表示されます)。
そして私がキーボード上で[done]をクリックしても、キーボードは消えますが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
を持つ必要があります。
これが役立つことを願っています
それを閉じるためにあなたは使うことができます
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(yourEditText.getWindowToken(), 0);
これはダイアログで使用するために機能します
public void showKeyboard(){
InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}
public void closeKeyboard(){
InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
}
私は同じ問題を抱えていました。 editText VISIBILITYがGONEからVISIBLEに変更された直後に、フォーカスを設定してソフトキーボードを表示する必要がありました。次のコードを使用してこれを達成しました。
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ミリ秒の遅れで失敗しました。
コードのコメント部分は別のアプローチを示しています。これは一部のデバイスでのみ機能します。私はOSバージョン2.2(エミュレータ)、2.2.1(実デバイス)、1.6(エミュレータ)でテストしました。
このアプローチは私に多くの苦痛を救った。
キーボードを表示させるには、
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
このメソッドはInputMethodManagerを直接呼び出すよりも信頼性があります。
閉じるには
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
他に何もうまくいかないときは、 それを強制的に表示させる :
editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
次のコードは、SearchView用のGoogleの4.1ソースコードから引用したものです。同様に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);
}
}
}
次に、コントロール/アクティビティが作成されたときに、次のコードを追加する必要があります。 (私の場合は、アクティビティではなく複合コントロールです)。
this.editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
setImeVisibility(hasFocus);
}
});
マニフェストファイル内のAndroid:windowSoftInputMode="stateAlwaysVisible"
- >.
edittext.requestFocus();
- >コード内.
これにより、アクティビティが表示されたときにedit-textがフォーカスを要求するソフトキーボードが開きます。
私は以下のコードでいくつかの単純なケースでいくつかの最近の運を持っています。すべてのテストを終えたわけではありませんが…….
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));
そしてキーボードが表示される前に。
ソフトキーボードを表示させることができます、それは私のために働きます:
...
dialog.show();
input.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
キーボードを隠すには、これを使います。
getActivity().getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
キーボードを表示するには
getActivity().getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
時々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
は私のためにまったく機能していませんでした。
私は入力モードを設定する必要があると考えました:(ここでマニフェストのActivityコンポーネントに)
Android:windowSoftInputMode="stateVisible"
フラグメントについては、確実に動作します。
displayName = (EditText) view.findViewById(R.id.displayName);
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
私は様々な状況で同じ問題を抱えていました、そして私が見つけた解決策は他ではうまくいきません。
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);
}
});
}
}
}
私はここですべてを結合しました、そして私のためにそれは働きます:
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();
}
}
アクティビティのアニメーションがソフトキーボードを無効にできることを発見したとき、私のソフトキーボードに関する問題は解決しました。あなたがその意図を
i.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
そして
overridePendingTransition(0, 0);
それはソフトキーボードを隠すことができますし、それを表示する方法はありません。
それは私のために働きました。これを試してキーボードを表示することもできます。
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
コードスニペット 。 。 。
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);
}
});
final InputMethodManager keyboard = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
マニフェストファイルにAndroid:windowSoftInputMode = "stateHidden"を追加するだけです。
上記のすべての解決策( InputMethodManager OnFocusChangeListener.onFocusChange に接続されたリスナーは、 EditText に添付されている場合、アクティビティを1回編集するだけで問題ありません。
私の場合は2回編集しています。
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に対してトリガーされることを私は観察しました。結局、キーボードは見えませんでした。
「EditTextテキストにフォーカスがある場合にキーボードを表示する」という場合に、一般的な解決策に正しい文があるはずです。
アクティビティの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"/>
ビューアニメーションを使用していると同じような問題がありました 。それで、私は 表示されたエディットテキストのキーボードアクセスを要求しようとする前に - アニメーションが終わるのを待つことを確認するためにアニメーションリスナーを入れました。
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) {
}
});
私はそのためにraukodraugがswithviewで使用することに同意します。
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);
}
});
よろしく。
私のアプリの1つでは、ソフトキーボードがアクティビティの入力時に自動的に表示されていたため(onCreateにeditText.requestFocus()があります)、奇妙な動作を発見しました。
さらに掘り下げると、レイアウトの周りにScrollViewがあるためです。 ScrollViewを削除した場合、動作は元の問題の説明に記載されているとおりです。すでにフォーカスされているeditTextをクリックした場合にのみ、ソフトキーボードが表示されます。
うまくいかない場合は、ScrollViewを使用してみてください - とにかく無害です。
EditTextがRecyclerまたはListView内にあり、かつ/またはこれが無効の状態でコードを使用している場合。
public static void showKeyboardByFocus(final View view)
{
view.requestFocus();
InputMethodManager keyboard = SystemMaster.getInputMethodManager();
keyboard.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
Runnable re = new Runnable()
{
@Override
public void run()
{
view.setEnabled(true);
view.requestFocus();
}
};
Handler h = new Handler(Looper.getMainLooper());
h.postDelayed(re, 360);
}
EditTextビューに次の行を追加するだけです:
Android:isScrollContainer="true"
tADA-キーボードが自動的に表示されるようになりました!
私は同様の問題を抱えていて、この単純で奇妙な解決策を発見しました。
ここでuser3392439で既に述べたように、フォーカス時のキーボードの外観は、XMLファイル内のスクロールコンポーネントのプレゼンスと何らかの形で奇妙に結びついています。
another同じXMLで上記の行を含むEditTextビューが存在する場合でも、EditTextのいずれが現在フォーカスされているかに関係なくキーボードが表示されます。
XMLファイルにスクロールコンポーネントを含むvisibleビューが少なくとも1つある場合、キーボードはフォーカス時に自動的に表示されます。
スクロールしない場合-EditTextをクリックしてキーボードを表示する必要があります。
Xamarinを使用して、これはフラグメントの中で私のために働きます:
using Android.Views.InputMethods;
using Android.Content;
...
if ( _txtSearch.RequestFocus() ) {
var inputManager = (InputMethodManager) Activity.GetSystemService( Context.InputMethodService );
inputManager.ShowSoftInput( _txtSearch, ShowFlags.Implicit );
}
キーパッドでクリックしたら、activity()のonCrete()メソッドでeditTextのrequestFocus()メソッドを呼び出し、同じeditTextでclearFocus()メソッドを呼び出します。
これはワイルドですが、実際にはうまくいきます
fun showKeyboard(view: View) {
try {
InputMethodManager::class.Java.getMethod(
"showSoftInputUnchecked",
Int::class.javaPrimitiveType,
ResultReceiver::class.Java
).apply {
isAccessible = true
invoke(view.context.inputMethodManager, 0, null)
}
}
catch (e: Exception) {
e.printStackTrace()
}
}
フォーカスを受けたときにソフトキーボードを開くことを認識している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;
}
}
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);
そしてKotlinのためには、単にこの拡張子を使ってください。
fun EditText.showKeyboard() {
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}
fun EditText.hideKeyboard() {
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(this.windowToken, 0)
}
私はタイマーを使います。 edittextがフォーカスされているときにキーボードで表示することができます。
edittext = (EditText) findViewById(R.id.edittext );
edittext.requestFocus();
edittext.setFocusableInTouchMode(true);
if (edittext.requestFocus()) {
final Thread timer = new Thread() {
public void run() {
try{
sleep(500);
InputMethodManager imm =(InputMethodManager) getApplicationContext().getSystemService(INPUT_METHOD_SERVICE);
imm.showSoftInput(edittext, SHOW_IMPLICIT);
} catch (Exception e) {
e.printStackTrace();
}
}
};
timer.start();
私はこのヘルプクラスを作りました。キーボードとキーボードを非表示にした後、フォーカスとキーボードを表示するコンテキストとビューを渡すだけです。お役に立てば幸いです。
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);
}
}