Android: Bagaimana cara mencegah keyboard lunak mendorong tampilan saya ke atas?

386

Saya memiliki laci geser vertikal di bagian bawah aplikasi saya. Ketika keyboard lunak terbuka, itu mendorong tab untuk laci ke atas, sehingga duduk di atas keyboard. Saya sebenarnya ingin itu tetap di bagian bawah layar, menjadi tersembunyi ketika keyboard ditampilkan.

Adakah orang lain yang mengalami masalah ini? Tahu cara memperbaikinya?

Christopher Perry
sumber
1
hai, saya mengalami masalah yang sama dengan flag mana yang telah Anda gunakan dalam file manifes, dapatkah Anda membantu saya dengan hal itu
Nixit Patel
1
Pertanyaan ini diduplikasi di sini: stackoverflow.com/questions/5516216/…
WonderWorker

Jawaban:

656

Anda dapat dengan mudah memindahkan windowSoftInputModebendera Aktivitas Anda ke adjustPandalam AndroidMainfest.xmlfile Anda di dalam tag aktivitas Anda.

Periksa dokumentasi resmi untuk info lebih lanjut.

<activity
   ...
   android:windowSoftInputMode="adjustPan"> 
</activity>
Alexander Oleynikov
sumber
43
Saya tidak ingin tampilan pan, saya ingin tetap statis di mana itu, dan hanya tutup keyboard apa pun yang akan menutupi.
Christopher Perry
5
Dengan menggeser itu berarti tampilan akan digulir untuk membuat tampilan yang Anda ketikkan itu terlihat. Dengan kata lain jika hanya muncul keyboard tidak menutupi tampilan fokus itu akan tetap statis.
Alexander Oleynikov
18
Saya menghadapi masalah yang sama. membuat flag windowSoftInputMode ke "AdjustPan" di file manifeast.tapi tidak berfungsi. bagaimana mengatasinya
Subrat
20
Tidak membantu dalam kasus saya memiliki deretan tombol di bagian bawah layar dan ScrollView di atasnya. Tombol-tombol bisa didorong ke atas, apa pun nilainya di windowSoftInputMode.
Artem Russakovskii
3
tidak bekerja dalam fragmen. Bagaimana melakukannya secara terpisah?
Prashanth Debbadwar
175

Tidak ada jawaban yang bekerja untuk saya, tetapi ini berhasil:

android:windowSoftInputMode="adjustNothing"
Daniel Douglas
sumber
6
Ini membuat keyboard tampak overlay konten, tanpa membuat tata letak untuk menghitung ulang tinggi itu.
Reinherd
13
Ini memecahkan masalah keyboard yang mendorong konten ke atas yang merupakan apa yang saya dan OP ingin capai.
Daniel Douglas
8
meminjam dari @Dom yang dapat Anda gunakan getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);untuk mengatur nilai ini secara terprogram
Bron Davies
1
Yang ini bekerja untuk saya, tidak seperti jawaban lain (jelly bean 4.1)
Virus721
Sempurna! Ini juga berfungsi dalam kasus saya. Saya menunjukkan dialog yang memiliki edittext di dalamnya. Segera setelah dialog terbuka, keyboard juga muncul. Saya telah mencoba "AdjustPan", tetapi ia memblokir fitur keyboard yang muncul. Jadi, "AdjustNothing" bekerja lebih baik dalam kasus saya.
sembozdemir
85

Dalam kasus saya, alasan tombol-tombol ditekan adalah karena pandangan di atas mereka adalah ScrollView, dan itu runtuh dengan tombol-tombol ditekan di atas keyboard tidak peduli berapa pun nilai android:windowSoftInputModepengaturan saya.

Saya dapat menghindari deretan tombol terbawah yang didorong oleh keyboard lunak dengan mengatur android:isScrollContainer="false"tombol ScrollViewyang berada di atas tombol.

Artem Russakovskii
sumber
2
Tetapi dalam hal ini keyboard lunak menutupi bagian layar dan tidak ada cara untuk menggulir ke bawah. Sepertinya hanya ada satu cara untuk mencegah panel bawah muncul di bagian atas keyboard - menyembunyikannya saat keyboard terbuka ...
Dmitry
1
ini dia! Pengaturan ini menurut saya sangat menarik untuk dikomentari, seperti satu-satunya cara yang saya temukan untuk mencapai efek dari properti yang hilang "AdjustNothing"!
rupps
Saya menggunakannya dengan Textview Working great tnx
Sunil Chaudhary
2
@ Artem Russakovskii Saya tidak tahu siapa Anda, tapi saya cinta Anda untuk solusi ini. Terima kasih banyak.
Im
1
@ Artem Russakovskii ini berfungsi dengan baik. Terima kasih banyak.
SkypeDogg
72

Anda dapat mencoba menambahkan atribut ini secara dinamis, dengan memasukkan kode berikut dalam onCreatemetode aktivitas Anda:

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

Ini bekerja untuk saya, tetapi itu:

android:windowSoftInputMode="adjustPan"

tidak.

Dom
sumber
Apakah Anda menambahkan android:windowSoftInputMode="adjustPan"di AndroidManifest.xml?
Habeeb Perwad
Tidak, karena itu tidak membuat perbedaan bagi saya. Baris kode pertama berhasil. :) @HabeebPerwad
Dom
Saya menambahkan baris detik dalam file AndoidManifest.xml. Saya pikir setelah itu hanya bekerja. jadi tanyakan saja.
Habeeb Perwad
1
@ Tom, bagaimana cara menggunakan " getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);" dalam sebuah fragmen?
Tushar Gogna
1
Akhirnya! Ini bekerja! Saya punya controller (meluas dari FragmentActivity) dan beberapa pandangan yang melekat padanya (pandangan meluas dari RelativeLayout). Jadi, dalam tampilan yang merepotkan, saya memang controller.getWindow()...menyukai Anda. Bekerja
Alaa M.
39

Jawaban-jawaban ini tidak membantu saya. Jadi saya mencoba ini:

android:windowSoftInputMode="adjustResize"

Ini berfungsi seperti pesona, Sekarang tajuk aplikasi saya tidak hilang. Lebih halus.

amalBit
sumber
Ini hampir berfungsi dengan baik untuk saya. Satu-satunya masalah adalah bilah / baris saran keyboard masih menyembunyikan tata letak saya. Apakah Anda menghadapi masalah seperti itu?
Sufian
Saya belum menghadapi masalah ini. @Sufian
amalBit
Saya tidak menghadapi masalah apa pun saat itu. Sekarang saya tidak yakin. @Sufian
amalBit
Bagi mereka yang mungkin menghadapi masalah serupa, itu mungkin karena TabLayout. Masalahnya hilang begitu saya mengatur visibilitas ke View.GONE. Mungkin sudah waktunya untuk mendesain ulang tata letak saya.
Sufian
13

Untuk melakukan ini secara terprogram dalam fragmen Anda dapat menggunakan kode berikut

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

Tempatkan ini di onResume ()

ChaturaM
sumber
11

Untuk pembaca masa depan.

Saya ingin kontrol khusus atas masalah ini, jadi inilah yang saya lakukan:

Dari fragmen atau aktivitas, sembunyikan tampilan Anda yang lain (yang tidak diperlukan saat keyboard menyala), lalu pulihkan untuk menyelesaikan masalah ini:

            rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    Rect r = new Rect();
                    rootView.getWindowVisibleDisplayFrame(r);
                    int heightDiff = rootView.getRootView().getHeight() - (r.bottom - r.top);

                    if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
                    //ok now we know the keyboard is up...
                        view_one.setVisibility(View.GONE);
                        view_two.setVisibility(View.GONE);

                    }else{
                    //ok now we know the keyboard is down...
                        view_one.setVisibility(View.VISIBLE);
                        view_two.setVisibility(View.VISIBLE);

                    }
                }
            });
Petro
sumber
1
@ Skynet Anda benar sekali! Ini adalah solusi khusus yang saya gunakan untuk masalah saya sendiri.
Petro
7
Hei, ini brilian. Namun, misalnya keyboard ditutup, ada periode singkat (milidetik) di mana tampilan dialihkan menjadi terlihat. Jadi alih-alih mengatur visibilitas secara langsung, saya menggunakan view.post(Runnable runnable)dan mengatur visibilitas dari sana. Ternyata bagus untuk saya
daisura99
9

Hanya satu baris yang akan ditambahkan ...

Tambahkan android:windowSoftInputMode="stateHidden|adjustPan"aktivitas yang diperlukan dari Anda manifest file.

Saya baru saja dipecahkan :) :)

Sravani
sumber
8

Untuk pengguna xamarin menambahkan kode ini ke atribut Activity dari kelas MainActivity,

WindowSoftInputMode =Android.Views.SoftInput.AdjustNothing

atau Anda dapat menambahkan kode ini Window.SetSoftInputMode(Android.Views.SoftInput.AdjustNothing)ke metode OnCreate dari kelas MainActivity.

Patel Tushar
sumber
8

Yang ini berhasil untuk saya

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
Suresh Pattu
sumber
7

Sejauh ini jawabannya tidak membantu saya karena saya memiliki tombol dan bidang input teks (berdampingan) di bawah textView yang terus disembunyikan oleh keyboard, tetapi ini telah memecahkan masalah saya:

android:windowSoftInputMode="adjustResize"
Michael McDowell
sumber
7

Tambahkan kode berikut ke 'aktivitas' file Manifest.

android:windowSoftInputMode="adjustResize"
Jose Kurian
sumber
Ini bekerja dengan baik. Namun, hanya untuk saran, itu tidak berfungsi dengan baik ketika Anda menggunakan persen. Karena itu menyesuaikan beberapa elemen. Jadi, jika Anda memiliki elemen Kendala dengan persen Anda akan memiliki masalah. Gunakan wrap_content sebagai gantinya dan itu akan bekerja dengan sangat baik.
Thiago Silva
7
android:windowSoftInputMode="stateHidden|adjustNothing"

Kode ini berfungsi.

amyShamna
sumber
Saya pikir android: windowSoftInputMode = "stateHidden | adjustPan" juga bisa digunakan.
Arthur Sady Cordeiro Rossetti
6

Ini adalah yang terbaik yang berhasil untuk saya

android:windowSoftInputMode="adjustNothing"

Cobalah!

rajlaxmi_jagdale
sumber
4

Yah saya telah menyaksikan jawaban ini tetapi dalam kasus saya saya jatuh ke masalah yang sama dan mendapat perlindungan melalui solusi yang sangat berguna dan termudah yang melibatkan menempatkan atribut tidak bersalah yang sangat kecil di tag Scrollview Anda yang berada di file xml Anda. Itu adalah

android:isScrollContainer="false"

Semoga berhasil!

Ali Nawaz
sumber
4
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

Yang ini bekerja untuk saya.

Zhang Slardar
sumber
2

Untuk Tampilan Gulir:

jika setelah menambahkan android:windowSoftInputMode="stateHidden|adjustPan"di Android Manifest Anda dan masih tidak berfungsi.

Ini mungkin terpengaruh karena ketika keyboard muncul, itu akan menjadi tampilan gulir dan jika tombol Anda / benda apa pun tidak ada dalam tampilan gulir Anda maka objek akan mengikuti keyboard dan memindahkan posisinya.

Periksa xml Anda di mana tombol Anda berada dan pastikan itu berada di bawah bracket View scroll Anda dan tidak keluar dari sana.

Semoga ini bisa membantu. : D

Yils
sumber
2

Dalam kasus saya, saya perlu keyboard untuk tetap tersembunyi dan tepat setelah mengklik tombol tata letak saya perlu disesuaikan, jadi saya hanya menambahkan perintah ini dalam manifes dan itu menjadi super benar.

android:windowSoftInputMode="stateHidden|adjustResize"
Rafael Rodrigues
sumber
2

Saat Anda ingin menyembunyikan tampilan saat membuka keyboard.

Tambahkan ini ke dalam Aktivitas Anda dalam file manifes

android:windowSoftInputMode="stateHidden|adjustPan"
Hakim Khan
sumber
2

Tak satu pun dari mereka yang bekerja untuk saya, coba yang ini

 private void scrollingWhileKeyboard() {
    drawerlayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {

            Rect r = new Rect();
            try {
                drawerlayout.getWindowVisibleDisplayFrame(r);
                int screenHeight = drawerlayout.getRootView().getHeight();
                int keypadHeight = screenHeight - r.bottom;
                if (keypadHeight > screenHeight * 0.15) {
                    tabLayout.setVisibility(View.GONE);
                } else {
                    tabLayout.setVisibility(View.VISIBLE);
                }
            } catch (NullPointerException e) {

            }
        }
    });

}
Saljith Kj
sumber
1

Jendela utama aktivitas tidak akan mengubah ukuran untuk memberi ruang bagi keyboard lunak. Sebaliknya, isi jendela akan secara otomatis digeser sehingga fokus saat ini tidak pernah dikaburkan oleh keyboard dan pengguna selalu dapat melihat apa yang mereka ketik.

android:windowSoftInputMode="adjustPan"

Ini mungkin solusi yang lebih baik untuk apa yang Anda inginkan.

pengguna3243900
sumber
1

Coba gunakan ini:

android:windowSoftInputMode="stateHidden|adjustPan"
Ashish Gautam
sumber
1

Kode ini dapat membantu Anda. Gunakan dalam oncreatemetode Anda .

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Shiv prakash Yadav
sumber
Saya mencoba ini, tetapi saya mengalami masalah di mana tampilan memotong sedikit bagian bawah tampilan dan mendorong tampilan untuk menutupi waktu di atas? Adakah gagasan tentang perubahan tata letak atau apa yang dibutuhkan? stackoverflow.com/questions/39909897/…
Lion789
1

Sertakan dalam file manifes Anda di bawah aktivitas yang ingin Anda tampilkan. Tapi pastikan tidak menggunakan Aktivitas layar penuh

android:windowSoftInputMode="adjustPan"
pengguna3419461
sumber
1

@manifestasikan dalam aktivitas Anda:

android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
Juan Mendez
sumber
1

Saya telah memecahkan masalah saya dengan menambahkan

 android:windowSoftInputMode="adjustNothing" 

Dalam file manifest tambahkan.

dan membuat batasan Recyclerviews isScrollContainer menjadi false.

android:isScrollContainer="false"
JUTA GASHAW
sumber