Cara menampilkan soft-keyboard saat edittext fokus

461

Saya ingin secara otomatis menampilkan keyboard lunak ketika sebuah EditTextfokus (jika perangkat tidak memiliki keyboard fisik) dan saya memiliki dua masalah:

  1. Ketika saya Activityditampilkan, saya EditTextfokus tetapi keyboard tidak ditampilkan, saya harus mengklik lagi untuk menampilkan keyboard (itu harus ditampilkan ketika saya Activityditampilkan).

  2. Dan ketika saya mengklik selesai pada keyboard, keyboard diberhentikan tetapi EditTexttetap fokus dan Anda tidak mau (karena edit saya selesai).

Untuk melanjutkan, masalah saya adalah memiliki sesuatu yang lebih seperti pada iPhone: yang menjaga sinkronisasi keyboard dengan EditTextkeadaan saya (fokus / tidak fokus) dan tentu saja tidak menghadirkan keyboard-lunak jika ada yang fisik.

Ludovic Landry
sumber
Saya hanya memiliki EditText dasar seperti: <EditText android: id = "@ + id / myEditText" android: layout_width = "fill_parent" android: layout_height = "wrap_content" android: imeOptions = "actionDone" /> Dan pada aktivitas saya, saya memiliki ini: EditText editTxt = (EditText) findViewById (R.id.myEditText); editTxt.requestFocus ();
Ludovic Landry
2
Ini membantu saya lebih baik daripada jawaban dalam posting ini: stackoverflow.com/a/2418314/1491212
Armel Larcier

Jawaban:

629

Untuk memaksa keyboard lunak muncul, Anda dapat menggunakan

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

Dan untuk menghilangkan fokus EditText, sayangnya Anda harus memiliki bonekaView untuk meraih fokus.

saya harap ini membantu


Untuk menutupnya bisa Anda gunakan

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(yourEditText.getWindowToken(), 0);

Ini berfungsi untuk menggunakannya dalam dialog

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);
}
raukodraug
sumber
2
Jika saya melakukan ini, keyboard lunak ditampilkan ketika aktivitas muncul (bagus) tetapi ketika fokus saya meninggalkan EditText dan pergi ke Button misalnya, keyboard tetap (itu buruk).
Ludovic Landry
157
Tidak berfungsi untuk saya dengan EditText dalam dialog yang sudah memiliki fokus. Tidak yakin kenapa.
Matthias
10
@AbdellahBenhammou, mungkin melakukan panggilan requestFocus pada teks edit Anda sebelum menunjukkan input lunak mungkin menyelesaikan masalah Anda. Itu untuk saya.
r1k0
18
@AbdellahBenhammou, lakukan ini di DialogFragment Anda di onCreate (): getDialog (). GetWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
Phillip
22
Hanya berfungsi bersamaan dengan yang yourEditText.requestFocus()dijelaskan di sini: stackoverflow.com/questions/8991522/…
Vivek Pandey
231

Saya memiliki masalah yang sama. Segera setelah perubahan editText VISIBILITY dari GONE ke VISIBLE, saya harus mengatur fokus dan menampilkan keyboard lunak. Saya mencapai ini menggunakan kode berikut:

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

Ini bekerja untuk saya dengan keterlambatan 100 ms, tetapi gagal tanpa penundaan atau dengan hanya keterlambatan 1 ms.

Bagian kode yang dikomentari menunjukkan pendekatan lain, yang hanya berfungsi pada beberapa perangkat. Saya menguji pada OS versi 2.2 (emulator), 2.2.1 (perangkat nyata) dan 1.6 (emulator).

Pendekatan ini menyelamatkan saya dari banyak rasa sakit.

Mike Keskinov
sumber
48
Saya tidak tahu ada sesuatu yang begitu jelek dan indah pada saat yang bersamaan. Terima kasih banyak!
mkerley
15
@jellyfish ini mensimulasikan ketukan pada EditText. Untuk orang lain yang membaca ini, alih-alih membuat yang baru HandlerAnda juga bisa menggunakan View.postDelayed()metode pada yourEditTextwidget itu sendiri.
Tony Chan
5
Ini adalah solusi hack - jauh lebih baik oleh David Chandler.
Ben Bederson
4
Jika solusi David Chandler bekerja di semua versi Android / perangkat dan untuk kasus ketika VISIBILITAS baru saja berubah dari PERGI ke TERLIHAT, maka YA - Anda harus menggunakan solusinya.
Mike Keskinov
3
Sepakat. Apakah Anda tahu solusi yang lebih baik yang bekerja di semua rasa Android?
Mike Keskinov
162

Untuk menyebabkan keyboard muncul, gunakan

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

Metode ini lebih dapat diandalkan daripada memanggil InputMethodManager secara langsung.

Untuk menutupnya, gunakan

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
David Chandler
sumber
12
Adakah yang bisa menjelaskan mengapa ini lebih dapat diandalkan daripada meminta secara langsung InputMethodManager? (Untuk satu, itu tidak berhasil, tidak seperti solusi raukodraug.)
Matthew Quiros
5
Juga tidak bekerja untuk saya. Bekerja di Android 2.3.5. solusi raukodraug bekerja untuk saya. Mencari ketergantungan versi tetapi tidak dapat menemukannya.
Hugo Logmans
2
Ini bekerja untuk saya di Android 4.4.2. Metode InputMethodManager dipilih sebagai solusi untuk posting ini tidak berfungsi untuk saya.
Phil
setelah menggunakan metode dalam jawaban saya menambahkan ini dan itu berhasil, tetapi tanpa itu tidak berhasil. thanx
Manny265
2
Tidak bekerja untuk saya di Android 4.4.2. Ini menunjukkan keyboard tetapi tidak menyembunyikannya.
John J Smith
87

Ketika tidak ada lagi yang berfungsi, paksalah untuk ditampilkan :

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

Dan kemudian, jika Anda ingin menutupnya, di onPause () misalnya, Anda dapat menghubungi:

InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
Bolling
sumber
4
Anda benar, @Bolling! Ketika tidak ada yang berhasil, kode Anda menyelamatkan saya. Terima kasih!
Willian Paixao
3
Kode Anda adalah satu-satunya yang bekerja untuk saya, dan saya mencoba setiap solusi di halaman ini! Terima kasih banyak!
Mattia Ruggiero
4
jangan memaksanya. dalam beberapa kasus ketika Anda pergi dari latar depan ke latar belakang keyboard akan tetap ada karena Anda memaksanya. ini masalah fragmentasi tapi saya pernah melihatnya di Samsung Duos.
j2emanue
Saya biasanya selalu memiliki kode untuk menutup keyboard onPause () karena saya melihatnya macet bahkan jika Anda tidak memaksanya.
Bolling
Itu berhasil, tetapi ketika pindah ke layar lain, masih tetap terbuka
Sithu
75

Kode berikut dijarah dari kode sumber Google 4.1 untuk SearchView. Tampaknya bekerja, baik pada versi Android yang lebih rendah juga.

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

Kemudian di samping itu, kode berikut perlu ditambahkan ketika Kontrol / Kegiatan dibuat. (Dalam kasus saya ini adalah kontrol komposit, bukan aktivitas).

this.editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    public void onFocusChange(View v, boolean hasFocus) {
        setImeVisibility(hasFocus);
    }
});
Robin Davies
sumber
Terima kasih! Ini bekerja dengan sangat baik. Dan itu solusi yang saya lebih nyaman dengan dari semua jawaban dan topik yang saya baca tentang masalah ini.
Rui
37
:-D setImeVisibility(hasFocus)?
Matthias
Saya mencoba metode ini karena saya sebenarnya "menggulung tampilan pencarian saya sendiri" (tidak mau harus melakukan itu tetapi ada alasan). Ini bekerja untuk saya kecuali pada saat peluncuran kegiatan. Saya menambahkan android: windowSoftInputMode = "alwaysVisible" ke aktivitas dan sudah meminta requestFocus () dipanggil pada teks edit. Bekerja seperti jagoan.
javahead76
Adakah kebutuhan akan removeCallbacks (mShowImeRunnable)? Saya pikir setelah runnable dipilih untuk dijalankan dari antrian, itu juga akan dihapus dari antrian pada saat yang sama?
Cheok Yan Cheng
1
Setelah mencoba beberapa variasi, ini adalah satu-satunya yang bekerja secara konsisten untuk saya (Android 4.42). Thx
John J Smith
34

android:windowSoftInputMode="stateAlwaysVisible" -> dalam File manifes.

edittext.requestFocus(); -> dalam kode.

Ini akan membuka keyboard lunak di mana teks edit memiliki fokus permintaan saat aktivitas muncul.

gorenikhil33
sumber
2
Ini membuka keyboard di Kegiatan penciptaan.
xpto
tidak menjawab pertanyaan, tetapi membantu saya :)
S.Thiongane
membuka kunci tanpa requestfocus di api 22
David
Bekerja dengan baik untuk kasus saya. Saya bertanya-tanya mengapa meminta atribut fokus hanya dari xml perlu disebutkan manifestjuga!
sud007
30

Saya baru saja beruntung dalam beberapa kasus sederhana dengan kode di bawah ini. Saya belum menyelesaikan semua pengujian tetapi ....

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

Dan presto keyboard muncul.

Lekuk
sumber
Untuk kasus saya, saya memiliki tombol untuk menambahkan beberapa informasi opsional. Pada penangan button.onClick kode di atas ditambahkan untuk memaksa keyboard lunak muncul untuk input info opsional. Droid 2.2.2
Penyok
ini adalah solusi yang baik tetapi jangan lupa bahwa Anda harus membuat objek MotionEvent dan panggilan daur ulang () pada mereka setelah digunakan, untuk digunakan kembali oleh penelepon kemudian.
jimbob
Anda hanya perlu satu dispatchTouchEvent () dengan ACTION_UP sebagai argumennya ..
Mohammed Junaid
15

Anda dapat mencoba untuk memaksa keyboard lunak muncul, itu berfungsi untuk saya:

...
dialog.show();
input.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
Vadim Zin4uk
sumber
1
Ini berfungsi untuk saya ... Saya telah mencoba InputMethodManager ini imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); imm.showSoftInput (nama, inputMethodManager.SHOW_IMPLICIT); atau getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); tapi tidak ada yang bekerja.
Günay Gültekin
10

Terkadang jawaban raukodraug tidak berfungsi. Saya telah membuatnya dengan beberapa cobaan dan kesalahan:

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

Dan bagian EditText :

    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                hideKeyboard(getActivity());
            } else {
                showKeyboard(getActivity());
            }
        }
    });
Xieyi
sumber
1
Ini adalah satu-satunya solusi yang bekerja untuk saya di Android 5
user1021430
10

Untuk menyembunyikan keyboard, gunakan yang ini:

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

dan untuk menampilkan keyboard:

getActivity().getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
Mubashar
sumber
Untuk DialogFragment, Anda dapat memanggil ini di override onStart(), dan Anda dapat menggunakannya getDialog().getWindow()sebagai alternatif getActivity().getWindow().
Mr-IDE
10

Dan untuk Kotlin cukup gunakan ekstensi ini:

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)
}
bitvale
sumber
apa yang saya cari.
lasec0203
8

Untuk fragmen, tentu ini berfungsi:

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

showSoftInput sama sekali tidak bekerja untuk saya.

Saya pikir saya perlu mengatur mode input: (di sini di komponen Activity di manifes)

android:windowSoftInputMode="stateVisible" 
vincebodi
sumber
6

Percaya atau tidak masalah saya dengan Soft Keyboard diselesaikan ketika saya menemukan bahwa animasi Aktivitas dapat menonaktifkan Soft Keyboard. Ketika Anda memanggil niat dengan

i.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);

dan

overridePendingTransition(0, 0);

Itu dapat menyembunyikan Soft Keyboard dan tidak ada cara untuk menunjukkannya.

sparkbit
sumber
6

Saya memiliki masalah yang sama di berbagai situasi yang berbeda, dan solusi yang saya temukan bekerja di beberapa tetapi tidak bekerja di yang lain jadi di sini adalah solusi gabungan yang bekerja di sebagian besar situasi yang saya temukan:

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);
                }
            });
        }
    }
}
n0sferat0k
sumber
6
editText.post(new Runnable() {
    @Override
    public void run() {
        InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
});
Tamu
sumber
6

Saya menggabungkan semuanya di sini dan bagi saya itu berfungsi:

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

Ini berhasil untuk saya. Anda dapat mencoba ini juga untuk menampilkan keyboard:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
Tarit Ray
sumber
5

cuplikan kode. . .

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);
        }
    });
}
Jongz Puangput
sumber
5

Kotlin ekstensi untuk menampilkan keyboard saat fokus.

Ini adalah kombinasi dari tanggapan sebelumnya, yang mana terlalu panjang atau tidak lengkap.

Ekstensi ini mem-posting runnable pada antrian pesan yang menampilkan keyboard lunak setelah meminta fokus:

fun View.showSoftKeyboard() {
    post {
        if (this.requestFocus()) {
            val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm?.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
        }
    }
}

Sebut saja dari tampilan apa pun bila perlu setelah itu:

editText.showSoftKeyboard()
Alex Burdusel
sumber
4

cukup tambahkan android: windowSoftInputMode = "stateHidden" di file manifes ...

Prakash Gavade
sumber
4
final InputMethodManager keyboard = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
XXX
sumber
4

Di dalam manifes Anda:

android:windowSoftInputMode="stateAlwaysVisible"- Keyboard yang awalnya diluncurkan. android:windowSoftInputMode="stateAlwaysHidden" - Keyboard awalnya tersembunyi.

Saya suka menggunakan juga "adjustPan"karena ketika keyboard diluncurkan maka layar otomatis menyesuaikan.

 <activity
      android:name="YourActivity"
      android:windowSoftInputMode="stateAlwaysHidden|adjustPan"/>
Md Imran Choudhury
sumber
4

Cukup tambahkan baris ini di tampilan EditText Anda:

android:isScrollContainer="true"

dan TADA - keyboard mulai muncul secara otomatis!

Saya memiliki masalah yang sama dan menemukan solusi sederhana dan aneh ini.

Seperti yang telah disebutkan di sini oleh user3392439, penampilan keyboard pada fokus entah bagaimana terhubung dengan keberadaan komponen gulir dalam file XML.

Bahkan kehadiran tampilan EditText lain yang terdiri dari baris yang disebutkan di atas dalam XML yang sama membuat keyboard tampil tidak peduli yang mana dari EditText yang saat ini difokuskan.

Jika Anda memiliki setidaknya satu tampilan yang terlihat terdiri dari komponen gulir dalam file XML Anda - keyboard akan muncul secara otomatis saat fokus.

Jika tidak ada gulir - maka Anda perlu mengklik EditText untuk membuat keyboard muncul.

Waldmann
sumber
Ini sangat aneh tapi pasti berhasil - saya berusaha requesFocus()dari dalam klik penangan dan ini adalah satu-satunya cara selain showSoftInput SHOW_FORCED eksplisit
menggambar
Ya Tuhan, terima kasih kawan. Tidak ada petunjuk mengapa ini bekerja tetapi saya telah mengujinya pada 8 perangkat dari berbagai produsen dan bekerja setiap saat!
Antonio Vlasic
3

Semua solusi yang diberikan di atas ( InputMethodManager interaksi di OnFocusChangeListener.onFocusChange pendengar melekat Anda EditText berfungsi dengan baik jika Anda memiliki satu pengeditan dalam aktivitas.

Dalam kasus saya, saya memiliki dua suntingan.

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

Saya telah mengamati bahwa onFocusChange dipicu untuk tvX dengan hasFocus = true (keyboard ditampilkan) tetapi kemudian untuk TVY dengan hasFocus = true (keyboard disembunyikan). Pada akhirnya, tidak ada keyboard yang terlihat.

Solusi umum harus memiliki pernyataan yang benar jika "tampilkan keyboard jika teks EditText memiliki fokus"

Bartosz Bilicki
sumber
3

Di bagian onResume () Anda dari Kegiatan, Anda dapat memanggil metode 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;
  }
Vara
sumber
Apa WidgetUtils.showKeyboard? Itu yang paling penting di sini.
TWiStErRob
2

Tak satu pun dari Jawaban itu yang berfungsi untuk saya. Ini cara sederhana.

searchEditText.setVisibility(View.VISIBLE);
                final Handler handler=new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        searchEditText.requestFocus();
                    }
                }, 400);

Baru saja menunda metode requestFocus () selama 400 ms.

Satyajit Das
sumber
Terima kasih banyak, ini membutuhkan beberapa penundaan untuk menampilkan keyboard ...
hkh114
1

Saya menemukan perilaku aneh, karena di salah satu aplikasi saya, keyboard lunak itu secara otomatis ditampilkan saat memasukkan aktivitas (ada editText.requestFocus () di onCreate).

Pada penggalian lebih lanjut, saya menemukan bahwa ini karena ada ScrollView di sekitar tata letak. Jika saya menghapus ScrollView, perilaku tersebut seperti yang dijelaskan dalam pernyataan masalah asli: hanya dengan mengklik editText yang sudah difokuskan tidak muncul keyboard lunak.

Jika itu tidak berhasil untuk Anda, coba masukkan ScrollView - toh tidak berbahaya.

pengguna3392439
sumber
1

Saya memiliki masalah yang sama menggunakan animasi tampilan . Jadi saya telah meletakkan pendengar animasi untuk memastikan saya akan menunggu sampai animasi berakhir sebelum mencoba meminta akses keyboard pada edittext yang ditampilkan.

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

Saya setuju dengan raukodraug karenanya untuk menggunakan dalam swithview Anda harus meminta / menghapus fokus seperti ini:

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

Salam.

Jean-Luc Barat
sumber