webdevqa.jp.net

Edittextがフォーカスされているときにソフトキーボードを表示する方法

私はEditTextがフォーカスされたときに自動的にソフトキーボードを表示したいのですが(デバイスが物理的なキーボードを持っていない場合)、私は二つの問題を抱えています:

  1. Activityが表示されているとき、私のEditTextはフォーカスされていますが、キーボードは表示されていません。キーボードを表示するには、もう一度クリックする必要があります(Activityが表示されるときに表示されます)。

  2. そして私がキーボード上で[done]をクリックしても、キーボードは消えますがEditTextはフォーカスされたままでいて欲しくありません(私の編集が終わったので)。

再開するために、私の問題はiPhoneのような何かを持っていることです:それはキーボードを私のEditText状態と同期させ続け(フォーカスされた/フォーカスされていない)そしてもちろん物理的なものがあればソフトキーボードを提示しません。

392
Ludovic Landry

ソフトキーボードを表示させるには、次のようにします。

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);
}
537
raukodraug

私は同じ問題を抱えていました。 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(エミュレータ)でテストしました。

このアプローチは私に多くの苦痛を救った。

212
Mike Keskinov

キーボードを表示させるには、

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

このメソッドはInputMethodManagerを直接呼び出すよりも信頼性があります。

閉じるには

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
145
David Chandler

他に何もうまくいかないときは、 それを強制的に表示させる

editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
70
Bolling

次のコードは、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);
    }
});
69
Robin Davies

マニフェストファイル内のAndroid:windowSoftInputMode="stateAlwaysVisible" - >.

edittext.requestFocus(); - >コード内.

これにより、アクティビティが表示されたときにedit-textがフォーカスを要求するソフトキーボードが開きます。

30
gorenikhil33

私は以下のコードでいくつかの単純なケースでいくつかの最近の運を持っています。すべてのテストを終えたわけではありませんが…….

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));

そしてキーボードが表示される前に。

26
Dent

ソフトキーボードを表示させることができます、それは私のために働きます:

...
dialog.show();
input.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
14
Vadim Zin4uk

キーボードを隠すには、これを使います。

getActivity().getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

キーボードを表示するには

getActivity().getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
9
Mubashar

時々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());
            }
        }
    });
9
Xieyi

showSoftInputは私のためにまったく機能していませんでした。

私は入力モードを設定する必要があると考えました:(ここでマニフェストのActivityコンポーネントに)

Android:windowSoftInputMode="stateVisible" 
6
vincebodi

フラグメントについては、確実に動作します。

 displayName = (EditText) view.findViewById(R.id.displayName);
    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
6
Arish Khan

私は様々な状況で同じ問題を抱えていました、そして私が見つけた解決策は他ではうまくいきません。

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);
                }
            });
        }
    }
}
5
n0sferat0k

私はここですべてを結合しました、そして私のためにそれは働きます:

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();
    }
}
5
lxknvlk

アクティビティのアニメーションがソフトキーボードを無効にできることを発見したとき、私のソフトキーボードに関する問題は解決しました。あなたがその意図を

i.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);

そして

overridePendingTransition(0, 0);

それはソフトキーボードを隠すことができますし、それを表示する方法はありません。

4
sparkbit

それは私のために働きました。これを試してキーボードを表示することもできます。

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
4
Tarit Ray

コードスニペット 。 。 。

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);
        }
    });
}
4
Jongz Puangput
editText.post(new Runnable() {
    @Override
    public void run() {
        InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
});
4
Guest
final InputMethodManager keyboard = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
3
XXX

マニフェストファイルにAndroid:windowSoftInputMode = "stateHidden"を追加するだけです。

3
user2202953

上記のすべての解決策( 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テキストにフォーカスがある場合にキーボードを表示する」という場合に、一般的な解決策に正しい文があるはずです。

2
Bartosz Bilicki

アクティビティの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;
  }
2
Vikas

あなたのマニフェストの中:

Android:windowSoftInputMode="stateAlwaysVisible" - 最初にキーボードを起動しました。 Android:windowSoftInputMode="stateAlwaysHidden" - 最初は隠されていたキーボード.

私は"adjustPan"も使うのが好きです。キーボードが起動すると画面が自動調整されるからです。

 <activity
      Android:name="YourActivity"
      Android:windowSoftInputMode="stateAlwaysHidden|adjustPan"/>
2

ビューアニメーションを使用していると同じような問題がありました 。それで、私は 表示されたエディットテキストのキーボードアクセスを要求しようとする前に - アニメーションが終わるのを待つことを確認するためにアニメーションリスナーを入れました。

    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) {
        }
    });
1
Benjamin Piette

私はそのために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
Jean-Luc Barat

私のアプリの1つでは、ソフトキーボードがアクティビティの入力時に自動的に表示されていたため(onCreateにeditText.requestFocus()があります)、奇妙な動作を発見しました。

さらに掘り下げると、レイアウトの周りにScrollViewがあるためです。 ScrollViewを削除した場合、動作は元の問題の説明に記載されているとおりです。すでにフォーカスされているeditTextをクリックした場合にのみ、ソフトキーボードが表示されます。

うまくいかない場合は、ScrollViewを使用してみてください - とにかく無害です。

1
user3392439

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);
    }
1
Ali Bagheri

EditTextビューに次の行を追加するだけです:

Android:isScrollContainer="true"

tADA-キーボードが自動的に表示されるようになりました!

私は同様の問題を抱えていて、この単純で奇妙な解決策を発見しました。

ここでuser3392439で既に述べたように、フォーカス時のキーボードの外観は、XMLファイル内のスクロールコンポーネントのプレゼンスと何らかの形で奇妙に結びついています。

another同じXMLで上記の行を含むEditTextビューが存在する場合でも、EditTextのいずれが現在フォーカスされているかに関係なくキーボードが表示されます。

XMLファイルにスクロールコンポーネントを含むvisibleビューが少なくとも1つある場合、キーボードはフォーカス時に自動的に表示されます。

スクロールしない場合-EditTextをクリックしてキーボードを表示する必要があります。

0
Troll Berserker

Xamarinを使用して、これはフラグメントの中で私のために働きます:

using Android.Views.InputMethods;
using Android.Content;

...

if ( _txtSearch.RequestFocus() ) {
  var inputManager = (InputMethodManager) Activity.GetSystemService( Context.InputMethodService );
  inputManager.ShowSoftInput( _txtSearch, ShowFlags.Implicit );
}
0
sprocket12

キーパッドでクリックしたら、activity()のonCrete()メソッドでeditTextのrequestFocus()メソッドを呼び出し、同じeditTextでclearFocus()メソッドを呼び出します。

0
Er Prajesh

これはワイルドですが、実際にはうまくいきます

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()
    }
}
0
egorikem

フォーカスを受けたときにソフトキーボードを開くことを認識している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;
    }
}
0
SnoopDougg
 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);
0
saigopi

そして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)
}
0
bitvale

私はタイマーを使います。 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();
0
Cha Mildz

私はこのヘルプクラスを作りました。キーボードとキーボードを非表示にした後、フォーカスとキーボードを表示するコンテキストとビューを渡すだけです。お役に立てば幸いです。

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);
}

}

0
Vinicius Morais