Bagaimana cara mengatur fokus (dan menampilkan keyboard) pada EditText saya secara terprogram

180

Saya memiliki tata letak yang berisi beberapa tampilan seperti ini:

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

Bagaimana saya bisa mengatur fokus (menampilkan keyboard) pada EditTextprogram saya ?

Saya sudah mencoba ini dan itu berfungsi hanya ketika saya meluncurkan Activitynormal saya , tetapi ketika saya meluncurkannya dalam TabHost, itu tidak berhasil.

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

Jawaban:

353

Coba ini:

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

David Merriman
sumber
Diperbarui dengan kode untuk memaksa keyboard tampil dari jawaban ini: stackoverflow.com/questions/5105354/…
David Merriman
5
ini berfungsi hanya ketika saya meluncurkan aktivitas saya secara normal, tetapi ketika saya meluncurkan aktivitas saya di TabHost, itu tidak berfungsi,
Houcine
27
Ini tidak berfungsi. Yang ini berfungsi untuk saya InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0);
Günay Gültekin
5
"Ini tidak berhasil, saudara". Dalam beberapa kasus, Anda perlu memanggil kode ini secara tidak sinkron dari postDelayed (). Saya punya kasus ketika saya harus membuka keyboard setelah pengguna menekan "OK" pada dialog. Dan ketika dialog ditutup itu mengacaukan fokus. Jadi saya sudah memanggil kode di atas dari postDelayed (). Itu dieksekusi setelah dialog ditutup. Keuntungan.
Danylo Volokh
2
Berikan suara pada jawaban dan 62 pada "itu tidak berfungsi saudara" 🤔 Saya mengujinya untuk mendapatkan pendapat sendiri dan itu bekerja sempurna!)
Daniel
165

menggunakan:

editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
ungalcrys
sumber
20
Setelah mencoba lebih dari 5 pendekatan lain, ini adalah satu-satunya yang bekerja untuk saya (dari Viewsubkelas)
William
13
Saran ini menyebabkan keyboard diperbaiki, bahkan ketika bidang kehilangan fokus.
sampai
2
ya, itu bekerja untuk saya juga, dan imm.showSoftInput()tidak berhasil.
Spark.Bao
8
Meskipun metode ini berhasil, ia memiliki sisi buruk, berhenti dari aplikasi dengan tombol home (perangkat keras) akan membiarkan keyboard di layar. Anda harus menekan tombol kembali (perangkat keras) untuk menyembunyikan keyboard yang menganggapnya tidak berguna di layar beranda.
Adrien Horgnies
Pendekatan lain tidak berhasil untuk saya, yang ini berhasil. Terima kasih.
Iman Akbari
53

Ini bekerja untuk saya, Terima kasih kepada ungalcrys

Tampilkan keyboard:

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

Sembunyikan keyboard:

InputMethodManager imm = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
Danilo Raspa
sumber
2
Satu-satunya solusi lengkap. Terima kasih.
korro
41

showSoftInput sama sekali tidak bekerja untuk saya.

Saya pikir saya perlu mengatur mode input: android:windowSoftInputMode="stateVisible"(di sini di komponen Activity di manifes)

Semoga bantuan ini!

vincebodi
sumber
5
Ini hanya menunjukkan keyboard ketika aktivitas dimulai.
William
1
Luar biasa :) Mencoba banyak jawaban tetapi hanya dengan ini, saya bisa membuatnya bekerja :) Terima kasih banyak.
Srikanth
jawaban yang sangat diremehkan
Avinash R
Jawaban sempurna. Bekerja hanya dengan "editText.requestFocus ()". Terima kasih.
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);
Kunal Bhatia
sumber
1
Saya harus melakukan ini untuk membuatnya muncul di onResume (). Tanpa penundaan, tidak ada yang terjadi menggunakan setiap solusi yang dijelaskan dalam utas ini.
FranticRock
1
Itu ada. Itulah jawaban yang saya cari. Padahal, Anda tidak perlu menunda seluruh detik. Saya mencoba hanya 150 mili, dan itu bekerja dengan baik juga.
Rubberduck
1
Terima kasih! Ini berfungsi bahkan untuk 0 ms ( tb.post({ showKeyboard(tb) })). Perhatikan bahwa kita memerlukan tampilan EditText ( tb), bukan tampilan fragmen.
CoolMind
16

Berikut adalah cara membuat ekstensi kotlin untuk menampilkan dan menyembunyikan keyboard lunak:

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

Maka Anda bisa melakukan ini:

editText.showKeyboard()
// OR
editText.hideKeyboard()
alvarlagerlof
sumber
ini adalah solusi yang lebih baik dibandingkan dengan yang lain
d-feverx
5

Saya sarankan menggunakan LifecycleObserver yang merupakan bagian dari Menangani Siklus Hidup dengan Komponen Lifecycle-Sadar dari Android Jetpack .

Saya ingin membuka dan menutup Keyboard saat Fragmen / Aktivitas muncul. Pertama, tentukan dua fungsi ekstensi untuk EditText. Anda dapat menempatkannya di mana saja di proyek Anda:

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

Kemudian tentukan LifecycleObserver yang membuka dan menutup keyboard saat Activity / Fragment mencapai onResume()atau 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()
    }
}

Kemudian tambahkan baris berikut ke salah satu Fragmen / Aktivitas Anda, Anda dapat menggunakan kembali LifecycleObserver kapan saja. Misalnya untuk Fragmen:

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

}
Paul Spiesberger
sumber
4

Ini adalah Kelas KeyboardHelper untuk menyembunyikan dan menampilkan keyboard

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);
}
}
Hamza Khan
sumber
0

Cara pertama :

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

Cara kedua :

Dalam Manifest:

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

Dalam kode:

etPassword.requestFocus();
Hadi Note
sumber
0

Saya mencoba banyak cara dan itu tidak berfungsi, tidak yakin apakah itu karena saya menggunakan transisi bersama dari fragmen ke aktivitas yang berisi teks edit.

Btw edittext saya juga dibungkus dengan LinearLayout.

Saya menambahkan sedikit keterlambatan untuk meminta fokus dan kode di bawah ini berfungsi untuk saya: (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)
veeyikpong
sumber
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)
            }
        }
Vasudev
sumber
-1

Saya tidak bisa mendapatkan jawaban ini untuk bekerja sendiri. Solusi bagi saya adalah menggabungkan mereka:

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

Saya tidak yakin mengapa itu diperlukan bagi saya - menurut dokumen tampaknya kedua metode tersebut harus bekerja sendiri.

mwu
sumber
Ini jelas bukan praktik yang baik. Mungkin, transaksi Aktivitas atau Fragmen adalah campur tangan dengan keyboard lunak atau bendera Metode Input tidak diatur dengan benar tetapi cara baik, solusi ini tidak boleh digunakan.
Marcel Bro