プログラムでEditTextにフォーカスを設定(およびキーボードを表示)する方法


180

私はこのようないくつかのビューを含むレイアウトを持っています:

<LinearLayout>
<TextView...>
<TextView...>
<ImageView ...>
<EditText...>
<Button...>
</linearLayout>

EditTextプログラムでフォーカスを設定(キーボードを表示)するにはどうすればよいですか?

私はこれを試してみましたActivityが、正常に起動したときにのみ機能しますが、で起動するTabHostと機能しません。

txtSearch.setFocusableInTouchMode(true);
txtSearch.setFocusable(true);
txtSearch.requestFocus();


回答:


353

これを試して:

EditText editText = (EditText) findViewById(R.id.myTextViewId);
editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);

http://developer.android.com/reference/android/view/View.html#requestFocus()


この回答からキーボードを強制的に表示するようにコードを更新しました:stackoverflow.com/questions/5105354/…–
David Merriman

5
アクティビティを正常に起動したときにのみ機能しますが、TabHostでアクティビティを起動すると機能しません
Houcine

27
これは機能しません。これは私のために機能しますInputMethodManager imm =(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(InputMethodManager.SHOW_FORCED、0);
GünayGültekin

5
「これは兄弟では機能しません」。場合によっては、このコードをpostDelayed()から非同期的に呼び出す必要があります。ユーザーがダイアログで[OK]を押した後にキーボードを開かなければならない場合がありました。そして、ダイアログが閉じていたとき、それはフォーカスを混乱させていました。したがって、上記のコードをpostDelayed()から呼び出しました。ダイアログが閉じた後に実行されました。利益。
Danylo Volokh

2
回答で237票、「兄弟ではうまくいかない」で62票🤔自分の意見を得るためにテストしましたが、完璧に機能します!)
Daniel

165

使用する:

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

20
5つ以上の他のアプローチを試した後、これは私のために(Viewサブクラスから)動作した唯一のアプローチでした
William

13
この提案により、フィールドがフォーカスを失っても、キーボードが修正されます。
まで

2
はい、それは私にとっても機能し、機能しimm.showSoftInput()ません。
Spark.Bao

8
この方法は機能しますが、欠点があります。ホームボタン(ハードウェア)でアプリケーションを終了すると、キーボードが画面に表示されます。キーボードを非表示にするには、戻るボタン(ハードウェア)を押す必要があります。
Adrien Horgnies 16

他の方法ではうまくいきませんでしたが、これはうまくいきました。ありがとうございました。
Iman Akbari

53

これは私のために働いた、ungalcrysのおかげで

キーボードを表示:

editText = (EditText)findViewById(R.id.myTextViewId);
editText.requestFocus();
InputMethodManager imm = (InputMethodManager)getSystemService(this.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY);

キーボードを非表示にする:

InputMethodManager imm = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

2
唯一の完全なソリューション。ありがとう。
korro 2017年

41

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

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

この助けを願っています!


5
これは、アクティビティが開始されたときにキーボードを表示しただけです。
William

1
素晴らしい:)たくさんの答えを試してみましたが、これでのみ、私はそれを機能させることができました:)どうもありがとうございました。
Srikanth、2015

非常に過小評価された回答
Avinash R

完璧な答え。「editText.requestFocus()」のみで機能します。ありがとう。
AVJ

37
final EditText tb = new EditText(this);
tb.requestFocus();
tb.postDelayed(new Runnable() {
    @Override
    public void run() {
        InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        inputMethodManager.showSoftInput(tb, InputMethodManager.SHOW_IMPLICIT);
    }
}, 1000);

1
onResume()に表示するために、これを行う必要がありました。遅延がなければ、このスレッドで説明されているすべてのソリューションを使用しても何も起こりません。
FranticRock 2016

1
そこにそれがある。それが私が探していた答えでした。ただし、必ずしも2秒の遅延全体を必要とするわけではありません。私は150ミリ秒だけを試しましたが、それもうまくいきました。
Rubberduck

1
ありがとう!これは0ミリ秒でも機能します(tb.post({ showKeyboard(tb) }))。tbフラグメントビューではなく、EditTextビュー()が必要であることに注意してください。
CoolMind

16

ソフトキーボードを表示および非表示にするためのkotlin拡張機能を作成する方法を次に示します。

fun View.showKeyboard() {
  this.requestFocus()
  val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
  inputMethodManager.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}

fun View.hideKeyboard() {
  val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
  inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
}

次に、これを行うことができます:

editText.showKeyboard()
// OR
editText.hideKeyboard()

これは残りの部分と比較して優れたソリューションです
d-feverx

5

私が使用することをお勧めしますLifecycleObserverの一部であり、ライフサイクル対応のコンポーネントとの取扱いのライフサイクルアンドロイドJetpackのを

フラグメント/アクティビティが表示されたらキーボードを開閉したいのですが。まず、EditTextに2つの拡張関数を定義します。プロジェクトのどこにでも配置できます。

fun EditText.showKeyboard() {
    requestFocus()
    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)
}

次に、Activity / Fragmentがに到達したとき、onResume()またはに到達したときにキーボードを開閉するLifecycleObserverを定義しますonPause

class EditTextKeyboardLifecycleObserver(private val editText: WeakReference<EditText>) :
    LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun openKeyboard() {
        editText.get()?.postDelayed({ editText.get()?.showKeyboard() }, 100)
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun closeKeyboard() {
        editText.get()?.hideKeyboard()
    }
}

次に、次の行をフラグメント/アクティビティのいずれかに追加すると、LifecycleObserverをいつでも再利用できます。例えばフラグメントの場合:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

    // inflate the Fragment layout

    lifecycle.addObserver(EditTextKeyboardLifecycleObserver(WeakReference(myEditText)))

    // do other stuff and return the view

}

4

キーボードを非表示および表示するためのKeyboardHelperクラスは次のとおりです

import android.content.Context;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

/**
 * Created by khanhamza on 06-Mar-17.
 */

public class KeyboardHelper {
public static void hideSoftKeyboard(final Context context, final View view) {
    if (context == null) {
        return;
    }
    view.requestFocus();
    view.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
assert imm != null;
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}, 1000);
}

public static void hideSoftKeyboard(final Context context, final EditText editText) {
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
assert imm != null;
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
}
}, 1000);
}


public static void openSoftKeyboard(final Context context, final EditText editText) {
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
assert imm != null;
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}
}, 1000);
}
}

0

最初の方法

    etPassword.post(() -> {
        etPassword.requestFocus();
        InputMethodManager manager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        manager.showSoftInput(etPassword, InputMethodManager.SHOW_IMPLICIT);
    });

2番目の方法

マニフェスト:

    <activity
        android:name=".activities.LoginActivity"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="stateVisible"/>

コードで:

etPassword.requestFocus();

0

私はたくさんの方法を試しましたが、うまくいきません。フラグメントから編集テキストを含むアクティビティへの共有遷移を使用しているため、確かにわかりません。

ところで、私のedittextもLinearLayoutでラップされています。

フォーカスを要求するために少し遅延を追加し、以下のコードが私のために働きました:(Kotlin)

 et_search.postDelayed({
     editText.requestFocus()

     showKeyboard()
 },400) //only 400 is working fine, even 300 / 350, the cursor is not showing

showKeyboard()

 val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
 imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)

0
editTxt.setOnFocusChangeListener { v, hasFocus ->
            val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            if (hasFocus) {
                imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY)
            } else {
                imm.hideSoftInputFromWindow(v.windowToken, 0)
            }
        }

-1

私はこれらの答えのいずれかを自分で機能させることができませんでした。私にとっての解決策はそれらを組み合わせることでした:

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

なぜそれが私に必要だったのかわかりません-ドキュメントによると、どちらの方法もそれ自体で機能するはずでした。


これは間違いなく良い習慣ではありません。おそらく、アクティビティまたはフラグメントトランザクションがソフトキーボードに介入しているか、入力メソッドフラグが正しく設定されていませんでしたが、どちらの方法でも、このソリューションは使用しないでください。
Marcel Bro 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.