プログラムでソフトキーボードを開く


115

子ウィジェットのないアクティビティがあり、対応するxmlファイルは、

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myLayout"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:focusable="true"
>
</LinearLayout>

アクティビティが開始する間にプログラムでソフトキーボードを開きたいと思います。今までに試したことは、

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (inputMethodManager != null) {
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }

少し教えてください。


こんにちはvigneshですが、textViewなしでソフトキーボードを開く必要性は何ですか?
2011

実際、私はそのアクティビティでキーリスナーを使用しようとしています。
Vignesh

あなたがしたことは正しいです。キーボードが表示されない理由がわかりません。このコードを1回使用して、editTextに対するユーザーアクションなしでキーボードを起動しましたが、成功しました。
Vinoth、2011

こんにちはVinothです。DSouzaの投稿とまったく同じようにコードを変更しました。質問でも更新しました。変更点があるかどうかを確認してください。
Vignesh 2011

回答:


145

次の行を使用して、onclickイベント内にソフトキーボードを手動で表示しました。キーボードは表示されています。

InputMethodManager inputMethodManager =
    (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInputFromWindow(
    linearLayout.getApplicationWindowToken(),
    InputMethodManager.SHOW_FORCED, 0);

しかし、アクティビティが開かれている間はまだ開くことができないので、これに対する解決策はありますか?


@YosiTaguri、アクティビティを扱う場合ははるかにエレガントです。そして、フラグメントはどうですか?両方の回答で+1
S.Thiongane 14

そして、あなたが編集テキストを持っているダイアログでキーボードを開かなければならないならば、どうですか?どうやってするか?
シーマ

5
@Vignesh:アクティビティの起動時にこのコードを実装する場合は、キーボードを開くときに500ミリ秒程度の遅延を与える必要があります。
Vinit Saxena

@vinitsaxena貴重なコメントありがとうございました
Vignesh

私にはわかりませんが、TextViewなどのビューを取得して、このようなリスナーを追加しようとしましたmyTextView.post(new Runnable(){public void run(){//ここにメソッド}}); このビューが作成されると、すべての画面が表示されるので、好きなように呼び出すことができます
Aleksey Timoshchenko

121

マニフェストファイルで<activity>、アクティビティの開始時にキーボードを表示するに以下を追加してください。

android:windowSoftInputMode="stateVisible"

これにより、アクティビティの開始時にキーボードが表示されるようになります。

その他のオプションについては、ドキュメントをご覧ください。


3
これらのすべての汚いハックをページの下部に表示するためだけに、私がこの回答にもっと頻繁に
賛成できることを望み

これをプログラムでどのように実行しますか?特定の状況でのみキーボードが自動的に表示されるようにしたい。
phreakhead 2013年

1
私はこのリンクのように入力ダイアログ持ってリンクをしませ活動ではなく、プロンプト上のキーボードを表示する方法?これはうまくいきました<code> InputMethodManager inputMethodManager =(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); if(inputMethodManager!= null){inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED、0); } <コード>
shareef 2013年

7
彼は「プログラムで」言います。
Mert Akcakaya

2
私にはうまくいきません。代わりに、これは次のことを行います。android:windowSoftInputMode = "stateAlwaysVisible"
Rendicahya 2013年

33

以下のコードに従ってください。きっとあなたの問題は解決されるでしょう。

if (imm != null){
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
   } 

こんにちは、onCreate関数内にコードを貼り付けましたが、それでも私のアクティビティに変更はありません。コードを貼り付けたい場合は、コメントに貼り付けます。
Vignesh 2011

ソフトキーボードにアクセスしたいときは、問題を解決できるように教えてください。コードを送ってください...可能であれば
AndroidDanger

線形レイアウト以外に何もないアクティビティにonKeyboardActionListenerを設定したいと思います。
Vignesh

上記の私の質問を参照してください。私があなたに提供したものでコードを編集しました。
Vignesh 2011

このアクティビティはキーボードアクション専用です。(onKeyboardActionListenerを使用して)押された各キーをリッスンし、それをローカルサーバーに同時に渡します
Vignesh

25

これは作品です

<activity
    ...
    android:windowSoftInputMode="stateVisible" >
</activity>

または

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

2
これをプログラムで設定する方法をありがとう-これは機能しますが、InputMethodManagerハックは機能しません。
Martin Vysny、2014年

17

必要なのは、非常に正確な瞬間にキーボードを露出することだけでした。これは私のために働いた!Benitesに感謝します。

    private Handler mHandler= new Handler();

そして、非常に正確な瞬間:

    mHandler.post(
    new Runnable() {
        public void run() {
            InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInputFromWindow(yourEditText.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);
            yourEditText.requestFocus();
        }
    }); 

ポスト行動を遅らせることに若干の修正とonResume()内は私のために働いていたこのソリューション: postDelayed( runnable, 500 /* msec */ );
AVIDeveloper

1
それをViewTreeObserverコールバックに入れて、最初のレイアウトで呼び出され、任意の時間待機する必要がないようにすることをお勧めします。より安全で応答性が高いはずです。
ガブリエル

このソリューションだけが私にとってうまくいきました。以前は機能していた以前の方法がありましたが、残念ながら最新のOSでは、ハンドラーが実行可能なソリューションです。
MD。Shafiul Alam Biplob

12

次の行を使用して、onclickイベント内に手動でソフトキーボードを表示しました。

public void showKeyboard(final EmojiconEditText ettext){
          ettext.requestFocus();
          ettext.postDelayed(new Runnable(){
            @Override public void run(){
              InputMethodManager keyboard=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
              keyboard.showSoftInput(ettext,0);
            }
          }
        ,200);
        }

9

それをonResumeメソッドに入れます:

findViewById(R.id.root_view_of_your_activity_layout).post(
new Runnable() {
    public void run() {
        InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
        inputMethodManager.toggleSoftInputFromWindow(yourEditText.getApplicationWindowToken(),     InputMethodManager.SHOW_FORCED, 0);
        yourEditText.requestFocus();
    }
});

OSがonResumeメソッドを起動したときにすべてのビューが描画されるかどうかを確認できないため、ルートレイアウトから呼び出されたpostメソッドがすべてのビューの準備ができるまで待機するため、ランナブルが必要です。


1
DialogFragmentにSearchViewがあり、Dialogが初めて表示されたときにSearchViewにフォーカスがありましたが、ユーザーがタッチしない限り、キーボードは起動しませんでした。OnResume ALONEからshowSoftInputとtoggleSoftInputFromWindowを使用するだけでした...またはSearchViewのOnFocusChangeListenerでさえも使用しましたが、ウィンドウが表示されて描画される前に起動したように見えるため、どれも機能しませんでした。 OnResumeでこの投稿イベントを使用することで、最終的に解決しました。
lepert 2013

8

これは機能しているようです

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_patientid);

        editText = (EditText)findViewById(R.id.selectPatient);
        //editText.requestFocus(); //works without that

    }

@Override
    protected void onResume() {

        findViewById(R.id.selectPatient).postDelayed(
        new Runnable() {
            public void run() {
                 editText.requestFocus();
                InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                inputMethodManager.showSoftInput(editText,InputMethodManager.SHOW_IMPLICIT);
            }
        },100);
        super.onResume();
    }

これはよりうまくいくようです:マニフェスト:

<application>
    <activity
        android:name="com.doodkin.myapp.ReportActivity"
        android:label="@string/title_activity_report"
        android:screenOrientation="sensor" 
        android:windowSoftInputMode="stateHidden" > // add this or stateVisible
    </activity>
</application>

マニフェストはアンドロイド4.2.2で機能しているようですが、アンドロイド4.0.3では機能していません


8

のonCreate活性の方法又はonActivityCreatedフラグメント

....
view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            view.removeOnPreDrawListener(this);
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

            // !Pay attention to return `true`
            // Chet Haase told to 
            return true;
        }
    });

6

私はこのようにソフトキーボードをプログラムで表示するために使用しました。これは、キーボードの起動中に画面の自動サイズ変更を防ぐために機能します。

マニフェスト:

<activity android:name="XXXActivity" android:windowSoftInputMode="adjustPan">
</activity>

XXXActvityの場合:

EditText et =  (EditText))findViewById(R.id.edit_text);  
  Timer timer = new Timer();
            TimerTask task = new TimerTask() {

                @Override
                public void run() {
                    InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                    inputMethodManager.toggleSoftInputFromWindow(et.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);

                }
            };
            timer.schedule(task, 200);

これにより、他の人がこの問題を探す時間を節約できると思います。


機能しますが、アプリを終了してもキーボードは表示されたままで、もう一度アプリを開いてキーボードを閉じると、キーボードは表示されません
nulll

今までこの問題に直面していませんでした。デバイスの問題だと思います。
Noundla Sandeep 2013

なぜタイマーが必要なのですか?より深く進むためのリンクを追加できますか?
nulll 2013

6

コトリン

fun hideKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.hideSoftInputFromWindow(view!!.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}

private fun showKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}

ジャワ

public static void hideKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}

private static void showKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}

3
InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

3

私はそれをシングルトンのように使用しました:

public static void showSoftKeyboard(final Context context, final EditText editText) {
        try {
            editText.requestFocus();
            editText.postDelayed(
                    new Runnable() {
                        @Override
                        public void run() {
                            InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
                            keyboard.showSoftInput(editText, 0);
                        }
                    }
                    , 200);
        } catch (NullPointerException npe) {
            npe.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

次のようなアクティビティで使用します。

showSoftKeyboard(this, yourEditTextToFocus);

関数の使用方法と関数自体の短いスニペットを含めていただき、誠にありがとうございます。それは私が必要としていたとおりに機能します!
チャドウィルソン

3

これは機能します:

private static void showKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

そして、このメソッドを次のように呼び出します。

showKeyboard(NameOfActivity.this);

2

InputMethodManager.SHOW_FORCEDは適切な選択ではありません。この設定を使用する場合は、キーボードの状態を非表示にする必要があります。私の提案はこのようなものです。

    public void showSoftKeyboard(View view) {
    InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
    view.requestFocus();
    inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
}

また、パラメーター(通常はEditText)を使用してビューに集中できます。これにより、より便利な機能になります

InputMethodManager.SHOW_IMPLICITおよびSHOW_FORCEDの詳細については、InputMethodManager


1

これは必要なソースコードです:

public static void openKeypad(final Context context, final View v) 
 {
new Handler().postDelayed(new Runnable() 
{
    @Override
    public void run() 
    {
        InputMethodManager inputManager =   (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); 
        inputManager.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);    
        Log.e("openKeypad", "Inside Handler");
    }
},300);}

詳細については、こちらのリンクをご覧ください。これは私を助けました。 https://github.com/Nikhillosalka/Keyboard/blob/master/README.md


1
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

上記のコードをonResume()で使用してソフトキーボードを開く


1

@ShimonDoodkinの回答と同様に、これは私が断片的にやったことです。

https://stackoverflow.com/a/29229865/2413303

    passwordInput.postDelayed(new ShowKeyboard(), 300); //250 sometimes doesn't run if returning from LockScreen

どこShowKeyboard

private class ShowKeyboard implements Runnable {
    @Override
    public void run() {
        passwordInput.setFocusableInTouchMode(true);
        passwordInput.requestFocus();            
        getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(passwordInput, 0);
    }
}

入力が成功したら、キーボードも非表示にします

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
                    .hideSoftInputFromWindow(getView().getWindowToken(), 0);

1
public final class AAUtilKeyboard {

public static void openKeyboard(final Activity activity, final EditText editText) {
    final InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
}

public static void hideKeyboard(final Activity activity) {
    final View view = activity.getCurrentFocus();
    if (view != null) {
        final InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm != null) {
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }
}

0

答えはすでに多すぎますが、これ以外には何もうまくいきませんでした

inputMethodManager.showSoftInput(emailET,InputMethodManager.SHOW_FORCED);

で使用showSoftInputしたSHOW_FORCED

そして私の活動は

 android:windowSoftInputMode="stateVisible|adjustResize"

これが誰かを助けることを願っています


0

このメソッドを基本アクティビティに投稿し、魅力のような他のアクティビティに使用します

public void openKeyboard() {
    InputMethodManager imm =
            (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.