Keyboard bermunculan otomatis saat memulai Aktivitas


97

Saya mendapat pertanyaan yang relatif sederhana. Saya memiliki aktivitas dengan banyak EditText di dalamnya. Saat saya membuka aktivitas, secara otomatis fokus ke EditText pertama dan menampilkan keyboard virtual.

Bagaimana cara mencegahnya?


Periksa jawaban saya untuk pertanyaan ini stackoverflow.com/questions/39593324/…
Bantuan Android

Saat Aplikasi Saya Diluncurkan (buka) dan jika tampilan edit teks Tersedia, maka keyboard Otomatis (tampilkan) aktif. Cara mengatasi masalah ini klik di sini easycomacademy.com/…
AhmadUllah Ahmad

Jawaban:


209

Gunakan atribut ini di tag tata letak Anda dalam file XML:

android:focusable="true"
android:focusableInTouchMode="true"

Seperti yang dilaporkan oleh anggota lain dalam komentar, ini tidak berfungsi, ScrollViewoleh karena itu Anda perlu menambahkan atribut ini ke turunan utama ScrollView.


3
Ini memperbaiki masalah saya juga. Saya menambahkan ini ke tag RelativeLayout untuk aktivitas saya. Terima kasih!
Lukas

21
Yang cukup menarik, itu tidak berhasil ketika saya menambahkan di atas ke ScrollView, tetapi berhasil untuk LinearLayout
Jerry Brady

1
Saya pikir Anda harus meletakkannya di tata letak paling atas
Utsav Gupta

Jadi saya kira ini berfungsi karena Anda memberi tahu tata letak itu sendiri bahwa itu bisa memiliki fokus? Kalau tidak, ia menganggap perlu memberikan fokus pada kontrol pertama pada formulir? Anehnya, saya mendapatkan keyboard meskipun semua kontrol di formulir saya dinonaktifkan. Diperbaiki sekarang. Terima kasih!
crowmagnumb

1
Penting untuk diperhatikan bahwa solusi ini menciptakan masalah aksesibilitas (tampilan yang seharusnya tidak dapat difokuskan ditandai sebagai memiliki fokus) dan dapat memiliki konsekuensi yang tidak diinginkan.
Renato

96

Anda dapat menambahkan ini ke aktivitas Manifes Android Anda:

android:windowSoftInputMode="stateHidden|adjustResize"

Ini berfungsi, namun jika Anda memiliki latar belakang gambar dan khawatir Keyboard lunak Anda menyusut latar belakang gambar tersebut, gunakanandroid:windowSoftInputMode="stateHidden|adjustPan"
ArtiomLK

31

Saya memiliki beberapa implementasi yang dijelaskan di sini, tetapi sekarang saya telah menambahkan ke dalam AndroidManifest.xmluntuk Activityproperti saya :

android:windowSoftInputMode="stateAlwaysHidden"

Saya rasa ini adalah cara yang mudah meskipun Anda sedang menggunakannya fragments.

" stateAlwaysHidden " Soft keyboard selalu tersembunyi saat jendela utama aktivitas memiliki fokus input.


ini bekerja untuk saya dengan ScrollView dan RelativeLayout.
iversoncru

Ini tidak terlalu bagus untuk fragmen, karena Anda mengaitkan "keadaan tersembunyi" dengan aktivitas yang akan berisi semua fragmen Anda, yang berarti bahwa setiap fragmen yang ingin Anda tampilkan dalam aktivitas akan dipengaruhi oleh properti (bukan pada "per fragmen "dasar).
Pelpotronic

11

Jika Anda memiliki pandangan lain tentang aktivitas Anda seperti ListView, Anda juga dapat melakukan:

ListView.requestFocus(); 

di onResume () Anda untuk mengambil fokus dari editText .

Saya tahu pertanyaan ini telah dijawab tetapi hanya memberikan solusi alternatif yang berhasil untuk saya :)


5

https://stackoverflow.com/a/11627976/5217837 Ini hampir benar:

@Override
public void onCreate(Bundle savedInstanceState) {

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

}

Tetapi harus SOFT_INPUT_STATE_HIDDEN daripada SOFT_INPUT_STATE_ALWAYS_VISIBLE



3

Saya mengalami masalah yang sama, bahkan saat berpindah tab, keyboard muncul secara otomatis dan tetap aktif, dengan Android 3.2.1 di Tablet. Gunakan metode berikut:

public void setEditTextFocus(EditText searchEditText, boolean isFocused)
{
    searchEditText.setCursorVisible(isFocused);
    searchEditText.setFocusable(isFocused);
    searchEditText.setFocusableInTouchMode(isFocused);
    if (isFocused) {
        searchEditText.requestFocus();
    } else {
        InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
        inputManager.hideSoftInputFromWindow(searchEditText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS );
    }
}   

Di onCreate () dan di onPause () aktivitas untuk setiap EditText:

setEditTextFocus (myEditText, false);

Untuk setiap EditText, sebuah OnTouchListener:

    myEditText.setOnTouchListener(new EditText.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            setEditTextFocus(myEditText, true); 
            return false;
        }
    });

Untuk masing-masing EditTextdi OnEditorActionListener:

    myEditText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
                            .......
            setEditTextFocus(myEditText, false); 
            return false;
        }
    });

Dan untuk masing-masing EditTextdi layout xml:

            android:imeOptions="actionDone"
            android:inputType="numberDecimal|numberSigned" // Or something else

Mungkin ada lebih banyak kemungkinan pengoptimalan kode.


3
((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);

menggunakan fragmen ..kode ini berfungsi untuk menyembunyikan keyboard ... ketika fragmen terbuka hindari fokus pada keyboard bidang edittext ...
Sreelal S

2

Saya telah menemukan solusi sederhana ini yang berhasil untuk saya Tetapkan atribut ini di tata letak induk Anda:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainLayout"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true" >

Dan sekarang, saat aktivitas dimulai, tata letak utama ini akan mendapatkan fokus secara default.

Selain itu, kita bisa menghapus fokus dari tampilan turunan saat waktu proses dengan memberikan fokus ke layout utama lagi, seperti ini:

findViewById(R.id.mainLayout).requestFocus();

Semoga berhasil untuk Anda.


1

ini adalah solusi yang saya gunakan, bukan solusi terbaik tetapi bekerja dengan baik untuk saya

 editComment.setFocusableInTouchMode(false);
 editComment.setOnTouchListener(new OnTouchListener(){

                @Override
                public boolean onTouch(View v, MotionEvent event)
                {
                    // TODO Auto-generated method stub
                    editComment.setFocusableInTouchMode(true);
                     editComment.requestFocus() ;
                    return false;
                }});

1

Menariknya, dokumentasi ini https://developer.android.com/training/keyboard-input/visibility.html menyatakan bahwa ketika aktivitas dimulai dan fokus diberikan ke bidang teks, keyboard lunak tidak ditampilkan (dan kemudian berlanjut ke menunjukkan kepada Anda bagaimana agar keyboard ditampilkan jika Anda ingin dengan beberapa kode).

Di Samsung Galaxy S5 saya, beginilah cara kerja aplikasi saya (tanpa entri manifes atau kode tertentu) - tanpa keyboard lunak. Namun pada AVD Lollipop, keyboard lembut ditampilkan - bertentangan dengan dokumen yang diberikan di atas.

Jika Anda mendapatkan perilaku ini saat menguji dalam AVD, Anda mungkin ingin menguji pada perangkat nyata untuk melihat apa yang terjadi.


1

Ini memiliki beberapa jawaban bagus di posting berikut: Hentikan EditText dari mendapatkan fokus saat memulai Aktivitas . Yang biasa saya gunakan adalah kode berikut oleh Morgan :

<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
    android:focusable="true" 
    android:focusableInTouchMode="true"
    android:layout_width="0px" 
    android:layout_height="0px"/>

<!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component
to prevent the dummy from receiving focus again -->
<AutoCompleteTextView android:id="@+id/autotext"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:nextFocusUp="@id/autotext"     
    android:nextFocusLeft="@id/autotext"/>

CATATAN: Item dummy harus DITEMPATKAN SEBELUM elemen yang dapat difokuskan.

Dan saya pikir itu harus bekerja dengan sempurna bahkan dengan ScrollView dan tidak memiliki masalah dengan aksesibilitas baik untuk ini.


0

Ini terjadi saat EditText Anda secara otomatis mendapatkan Fokus seperti saat Anda memulai aktivitas. Jadi satu cara mudah dan stabil untuk memperbaikinya, cukup dengan mengatur fokus awal ke tampilan lain, seperti Tombol dll.

Anda dapat melakukan ini dalam XML tata letak Anda, tidak perlu kode ..


0

Jawaban yang diterima tidak berfungsi untuk saya, itu sebabnya berikan jawaban solusi yang berfungsi, semoga bermanfaat!

EditText edt = (EditText) findViewById(R.id.edt);
edt.requestFocus();    
edt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
edt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

Sekarang keyboard terbuka, nikmati :)


Pertanyaannya adalah bagaimana mencegah keyboard terbuka.
jk7

0

android: windowSoftInputMode = "stateHidden | adjustResize"

Bekerja dengan baik


0

Tambahkan kode di bawah ini ke bagian atas XML aktivitas Anda dan pastikan View berada di atas EditText

<View 
android:layout_width="0dp"
android:layout_height="0dp"
android:focusableInTouchMode="true"/>

0

android:focusableInTouchMode="true"

Tambahkan baris di atas ke xml dari EditTextatau TextInputLayoutyang memiliki fokus dan menyebabkansoftInputKeyboard pop up.

Ini memecahkan masalah bagi kami dan sekarang keyboard tidak muncul


0

search_edit_text = (EditText) findViewById (R.id.search_edit_text);

    search_edit_text.requestFocus();
    search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
    search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

Ini berfungsi untuk saya, fragmen guys mungkin memiliki beberapa sintaks yang berbeda. INI BEKERJA UNTUK AKTIVITAS


Anda perlu memberikan batasan, asumsi, atau penyederhanaan dalam jawaban Anda. Lihat detail lebih lanjut tentang cara menjawab di tautan ini: stackoverflow.com/help/how-to-answer
Usama Abdulrehman

-1

Jika tampilan Anda memiliki EditText dan Listview, maka Keyboard akan terbuka secara default. Untuk menyembunyikan keyboard agar tidak muncul secara default lakukan hal berikut

this.listView.requestFocus();

Pastikan Anda meminta fokus pada tampilan daftar setelah mendapatkan tampilan untuk editText.

Misalnya

this.listView = (ListView) this.findViewById(R.id.list);
this.editTextSearch = (EditText) this.findViewById(R.id.editTextSearch);
this.listView.requestFocus();

Jika Anda melakukannya, maka editText akan mendapatkan fokus dan keyboard akan muncul.


Saya melakukan ini tetapi keyboard mereka masih muncul dan fokusnya adalah dengan editText.
David Doria
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.