Saya telah banyak meneliti untuk menyesuaikan tata letak ketika papan tombol aktif dan saya telah berhasil mengimplementasikannya tetapi masalahnya muncul ketika saya menggunakan android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
ini dalam tag aktivitas saya dalam file manifes.
Untuk ini saya telah menggunakan android:windowSoftInputMode="adjustPan|adjustResize|stateHidden"
opsi yang berbeda tetapi tidak berhasil.
Setelah itu saya mengimplementasikan secara FullScreen
terprogram dan mencoba berbagai tata letak untuk bekerja FullScreen
tetapi semuanya sia-sia.
Saya merujuk tautan ini dan telah melihat banyak posting di sini terkait dengan masalah ini:
http://android-developers.blogspot.com/2009/04/updating-applications-for-on-screen.html
http://davidwparker.com/2011/08/30/android-how-to-float-a-row-above-keyboard/
Ini kode xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/masterContainerView"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"
android:background="#ffffff">
<ScrollView android:id="@+id/parentScrollView"
android:layout_width="fill_parent" android:layout_height="wrap_content">
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical">
<TextView android:id="@+id/setup_txt" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Setup - Step 1 of 3"
android:textColor="@color/top_header_txt_color" android:textSize="20dp"
android:padding="8dp" android:gravity="center_horizontal" />
<TextView android:id="@+id/txt_header" android:layout_width="fill_parent"
android:layout_height="40dp" android:text="AutoReply:"
android:textColor="@color/top_header_txt_color" android:textSize="14dp"
android:textStyle="bold" android:padding="10dp"
android:layout_below="@+id/setup_txt" />
<EditText android:id="@+id/edit_message"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:text="Some text here." android:textSize="16dp"
android:textColor="@color/setting_editmsg_color" android:padding="10dp"
android:minLines="5" android:maxLines="6" android:layout_below="@+id/txt_header"
android:gravity="top" android:scrollbars="vertical"
android:maxLength="132" />
<ImageView android:id="@+id/image_bottom"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_below="@+id/edit_message" />
</LinearLayout>
</ScrollView>
<RelativeLayout android:id="@+id/scoringContainerView"
android:layout_width="fill_parent" android:layout_height="50px"
android:orientation="vertical" android:layout_alignParentBottom="true"
android:background="#535254">
<Button android:id="@+id/btn_save" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_alignParentRight="true"
android:layout_marginTop="7dp" android:layout_marginRight="15dp"
android:layout_below="@+id/edit_message"
android:text = "Save" />
<Button android:id="@+id/btn_cancel" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_marginTop="7dp"
android:layout_marginRight="10dp" android:layout_below="@+id/edit_message"
android:layout_toLeftOf="@+id/btn_save" android:text = "Cancel" />
</RelativeLayout>
</RelativeLayout>
Saya ingin tombol 2 bawah harus naik ketika softkeyboard muncul dalam gambar.
sumber
android:windowSoftInputMode="adjustPan"
beri tahu saya jika ini berhasil ..adjustResize
danadjustPan
pada saat yang sama, dari javadoc dariandroid.view.WindowManager.LayoutParams#SOFT_INPUT_ADJUST_RESIZE
: "Ini tidak dapat digabungkan dengan {@link SOFT_INPUT_ADJUST_PAN}"Jawaban:
Berdasarkan solusi yghm, saya membuat kelas kenyamanan yang memungkinkan saya untuk menyelesaikan masalah dengan satu-liner (setelah menambahkan kelas baru ke kode sumber saya tentu saja). Satu-liner adalah:
Dan kelas implementasi adalah:
Semoga ini bisa membantu seseorang.
sumber
return (r.bottom - r.top);
denganreturn r.bottom
untuk membuatnya bekerja pada HTC One Mini saya, jika tidak, tampilan aktivitas akan didorong terlalu tinggi oleh ukuran bilah status. Saya belum mengujinya di perangkat lain. Semoga itu bisa membantu.frameLayoutParams.height = usableHeightSansKeyboard;
saya harus menggunakanframeLayoutParams.height = usableHeightNow;
Jika saya tidak melakukan ini beberapa elemen jatuh di luar layar.Karena jawabannya telah dipilih dan masalah diketahui sebagai bug, saya pikir saya akan menambahkan "Kemungkinan Bekerja Sekitar".
Anda dapat mengaktifkan mode layar penuh saat keyboard lunak ditampilkan. Ini memungkinkan "AdjustPan" bekerja dengan benar.
Dengan kata lain, saya masih menggunakan @android: style / Theme.Black.NoTitleBar.Fullscreen sebagai bagian dari tema aplikasi dan stateVisible | AdjustResize sebagai bagian dari mode input lunak jendela aktivitas tetapi untuk membuatnya bekerja bersama, saya harus beralih ke mode layar penuh sebelum keyboard muncul.
Gunakan Kode berikut:
Matikan mode layar penuh
Aktifkan mode layar penuh
Catatan - inspirasi berasal dari: Menyembunyikan Judul dalam mode Layar Penuh
sumber
Saya mencoba solusi dari Joseph Johnson , tetapi seperti orang lain saya mengalami masalah kesenjangan antara konten dan keyboard. Masalahnya terjadi karena mode input lunak selalu menggeser ketika menggunakan mode layar penuh. Panning ini mengganggu solusi Joseph ketika Anda mengaktifkan bidang input yang akan disembunyikan oleh input lunak.
Ketika input lunak muncul, konten pertama-tama digeser berdasarkan ketinggian aslinya, dan kemudian diubah ukurannya oleh tata letak yang diminta oleh solusi Joseph. Mengubah ukuran dan tata letak selanjutnya tidak membatalkan panning, yang menghasilkan celah. Urutan lengkap acara adalah:
Tidak mungkin untuk menonaktifkan panning, tetapi dimungkinkan untuk memaksa offset pan menjadi 0 dengan mengubah ketinggian konten. Ini bisa dilakukan di pendengar, karena dijalankan sebelum panning berlangsung. Mengatur ketinggian konten ke ketinggian yang tersedia menghasilkan pengalaman pengguna yang lancar, yaitu tidak berkedip.
Saya juga melakukan perubahan ini. Jika ada yang menimbulkan masalah, beri tahu saya:
getWindowVisibleDisplayFrame
. TheRect
cache untuk mencegah sedikit sampah yang tidak dibutuhkan.Ini telah diuji pada Nexus 5, dan emulator menjalankan level API 16-24 dengan ukuran layar mulai dari kecil hingga besar.
Kode telah porting ke Kotlin, tetapi porting perubahan saya kembali ke Jawa sederhana. Beri tahu saya jika Anda membutuhkan bantuan:
sumber
possiblyResizeChildOfContent
panggilan danremoveListener
panggilan, dan bahkan setelah saya mencapairemoveListener
breakpoint,possiblyResizeChildOfContent
masih dipanggil. Adakah orang lain yang mengalami masalah ini?Saya baru saja menemukan solusi yang sederhana dan andal jika Anda menggunakan pendekatan sistem UI ( https://developer.android.com/training/system-ui/immersive.html ).
Ini berfungsi dalam kasus ketika Anda menggunakan
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
, misalnya jika Anda menggunakanCoordinatorLayout
.Ini tidak akan berfungsi untuk
WindowManager.LayoutParams.FLAG_FULLSCREEN
(Yang Anda juga dapat mengatur dengan temaandroid:windowFullscreen
), tetapi Anda dapat mencapai efek yang sama denganSYSTEM_UI_FLAG_LAYOUT_STABLE
(yang "memiliki efek visual yang sama" menurut dokumen ) dan solusi ini harus bekerja lagi.Saya sudah mengujinya di perangkat saya yang menjalankan Marshmallow.
Kuncinya adalah keyboard lunak juga merupakan salah satu jendela sistem (seperti bilah status dan bilah navigasi), sehingga yang
WindowInsets
dikirim oleh sistem berisi informasi yang akurat dan dapat diandalkan tentang hal itu.Untuk use case seperti pada
DrawerLayout
kami mencoba menggambar di belakang bilah status, Kami dapat membuat tata letak yang mengabaikan hanya inset atas, dan menerapkan inset bawah yang menyumbang keyboard lunak.Ini kebiasaan saya
FrameLayout
:Dan untuk menggunakannya:
Secara teori ini harus berfungsi untuk perangkat apa pun tanpa modifikasi gila, jauh lebih baik daripada peretasan yang mencoba mengambil ukuran layar acak
1/3
atau1/4
sebagai referensi.(Ini membutuhkan API 16+, tapi saya menggunakan layar penuh hanya pada Lollipop + untuk menggambar di belakang bilah status jadi itu solusi terbaik dalam kasus ini.)
sumber
Harap dicatat bahwa
android:windowSoftInputMode="adjustResize"
tidak berfungsi ketikaWindowManager.LayoutParams.FLAG_FULLSCREEN
diatur untuk suatu kegiatan. Anda punya dua opsi.Nonaktifkan mode layar penuh untuk aktivitas Anda. Aktivitas tidak diukur ulang dalam mode layar penuh. Anda dapat melakukannya di xml (dengan mengubah tema aktivitas) atau dalam kode Java. Tambahkan baris berikut dalam metode onCreate () Anda.
ATAU
Gunakan cara alternatif untuk mencapai mode layar penuh. Tambahkan kode berikut dalam metode onCreate () Anda.
Harap dicatat bahwa metode-2 hanya berfungsi di Android 4.1 dan di atasnya.
sumber
Saya harus menghadapi masalah ini juga dan memiliki pekerjaan yang saya periksa di HTC one, galaxy s1, s2, s3, note dan sensasi HTC.
letakkan pendengar tata letak global pada tampilan root tata letak Anda
dan di sana saya memeriksa perbedaan ketinggian dan jika perbedaan tinggi layar lebih besar maka sepertiga pada tinggi layar maka kita dapat menganggap keyboard terbuka. mengambilnya dari jawaban ini .
ini mungkin bukan bukti peluru dan mungkin pada beberapa perangkat itu tidak akan berfungsi tetapi itu bekerja untuk saya dan berharap itu akan membantu Anda juga.
sumber
Saya menerapkan solusi Joseph Johnson dan itu bekerja dengan baik, saya perhatikan setelah menggunakan solusi ini kadang-kadang laci pada aplikasi tidak akan menutup dengan benar. Saya menambahkan fungsionalitas untuk menghapus listener removeOnGlobalLayoutListener ketika pengguna menutup fragmen di mana edittexts berada.
menggunakan kelas di mana edittext saya berada
sumber
Tambahkan
android:fitsSystemWindows="true"
ke tata letak, dan tata letak ini akan mengubah ukuran.sumber
Untuk membuatnya bekerja dengan Layar Penuh:
Gunakan plugin keyboard ionik. Ini memungkinkan Anda mendengarkan ketika keyboard muncul dan menghilang.
OnDeviceReady menambahkan pendengar acara ini:
Logika:
Pada dasarnya, jika perbedaannya minus maka itu adalah jumlah piksel yang menutupi keyboard dari input Anda. Jadi, jika Anda menyesuaikan div orang tua Anda dengan ini yang harus menangkalnya.
Menambahkan batas waktu ke logika mengatakan 300ms juga harus mengoptimalkan kinerja (karena ini akan memungkinkan waktu keyboard muncul.
sumber
Saya mencoba kelas Joseph Johnson, dan itu berhasil, tetapi tidak cukup memenuhi kebutuhan saya. Daripada meniru android: windowSoftInputMode = "adjustResize", saya perlu meniru android: windowSoftInputMode = "AdjustPan".
Saya menggunakan ini untuk tampilan web layar penuh. Untuk menggeser tampilan konten ke posisi yang benar, saya perlu menggunakan antarmuka javascript yang memberikan rincian tentang posisi elemen halaman yang memiliki fokus dan dengan demikian menerima input keyboard. Saya telah menghilangkan detail-detail itu, tetapi memberikan penulisan ulang saya tentang kelas Joseph Johnson. Ini akan memberikan dasar yang sangat kuat bagi Anda untuk mengimplementasikan pan kustom vs ukurannya.
sumber
Memang penampilan keyboard yang lembut sepertinya tidak mempengaruhi
Activity
apa pun yangwindowSoftInputMode
saya pilih dalamFullScreen
mode.Meskipun saya tidak dapat menemukan banyak dokumentasi di properti ini, saya pikir
FullScreen
mode ini dirancang untuk aplikasi game yang tidak memerlukan banyak penggunaan keyboard lunak. Jika Anda adalah Aktivitas yang memerlukan interaksi pengguna melalui keyboard lunak, harap pertimbangkan kembali menggunakan tema non-Layar Penuh. Anda bisa mematikan TitleBar menggunakanNoTitleBar
tema. Mengapa Anda ingin menyembunyikan bilah notifikasi?sumber
Tetap seperti
android:windowSoftInputMode="adjustResize"
. Karena itu diberikan untuk menjaga hanya satu dari"adjustResize"
dan"adjustPan"
(Mode penyesuaian jendela ditentukan dengan AdjustResize atau AdjustPan. Sangat disarankan agar Anda selalu menentukan satu atau yang lain). Anda dapat menemukannya di sini: http://developer.android.com/resources/articles/on-screen-inputs.htmlIni bekerja dengan baik untuk saya.
sumber
Saat ini saya menggunakan pendekatan ini dan itu berfungsi seperti pesona. Caranya adalah kita mendapatkan ketinggian keyboard dari metode yang berbeda pada 21 di atas dan di bawah dan kemudian menggunakannya sebagai padding bawah dari tampilan root kita dalam aktivitas kita. Saya berasumsi tata letak Anda tidak memerlukan bantalan atas (masuk di bawah bilah status) tetapi jika Anda melakukannya, beri tahu saya untuk memperbarui jawaban saya.
MainActivity.java
Jangan lupa untuk mengatasi tampilan root Anda dengan id:
activity_main.xml
Semoga ini bisa membantu seseorang.
sumber
hanya gunakan
android:windowSoftInputMode="adjustResize|stateHidden
saat Anda menggunakan AdjustPan maka itu menonaktifkan properti mengubah ukuransumber
sumber
berdasarkan https://stackoverflow.com/a/19494006/1815624 dan keinginan untuk mewujudkannya ...
ide yang diperbarui
menggabungkan jawaban dari
Kode yang relevan:
Sumber Lengkap di https://github.com/CrandellWS/AndroidBug5497Workaround/blob/master/AndroidBug5497Workaround.java
ide lama
Buat nilai statis tinggi wadah sebelum membuka keyboard. Atur tinggi wadah berdasarkan
usableHeightSansKeyboard - heightDifference
kapan keyboard dibuka dan atur kembali ke nilai yang disimpan saat ditutup.Metode dalam MainActivity
Contoh Wadah XML
margin yang sama dapat ditambahkan jika diperlukan ...
Pertimbangan lain adalah menggunakan bantalan contoh ini dapat ditemukan di:
https://github.com/mikepenz/MaterialDrawer/issues/95#issuecomment-80519589
sumber
1) Buat KeyboardHeightHelper:
2) Biarkan aktivitas Anda menjadi layar penuh:
activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
3) Dengarkan perubahan ketinggian keyboard dan tambahkan padding bawah untuk tampilan Anda:
Jadi , setiap kali keyboard akan muncul di layar - padding bawah untuk tampilan Anda akan berubah, dan konten akan disusun ulang.
sumber
Anda ingin bilah bawah menempel di bagian bawah tampilan, tetapi ketika keyboard ditampilkan, mereka harus bergerak ke atas untuk ditempatkan di atas keyboard, kan?
Anda dapat mencoba cuplikan kode ini:
BottomBar akan menempel di bagian bawah tampilan dan LinearLayout yang berisi ScrollView akan mengambil apa yang tersisa dari tampilan setelah bilah atas / bawah dan keyboard ditampilkan. Beri tahu saya jika itu bekerja untuk Anda juga.
sumber
Terima kasih, Joseph atas jawaban Anda. Namun, dalam metode maybeResizeChildOfContent (), porsinya
tidak berfungsi untuk saya, karena bagian bawah dari pandangan menjadi tersembunyi. Jadi saya harus mengambil variabel global restoreHeight, dan di konstruktor, saya memasukkan baris terakhir
dan kemudian saya mengganti bagian yang disebutkan sebelumnya dengan
Tetapi saya tidak tahu mengapa kode Anda tidak bekerja untuk saya. Akan sangat membantu, jika seseorang dapat menjelaskan hal ini.
sumber
Saya hanya menggunakan mode layar penuh untuk menyembunyikan bilah status. Namun, saya ingin aplikasi untuk mengubah ukuran ketika keyboard ditampilkan. Semua solusi lain (kemungkinan karena usia posting) rumit atau tidak mungkin untuk saya gunakan (ingin menghindari perubahan kode Java untuk karung PhoneGap Build).
Alih-alih menggunakan layar Penuh, saya mengubah konfigurasi saya untuk Android menjadi non-layar penuh:
Dan menambahkan
cordova-plugin-statusbar
, melalui baris perintah:Ketika aplikasi telah dimuat, saya memanggil metode sederhana pada plugin untuk menyembunyikan dirinya, seperti:
Ini bekerja seperti pesona. Satunya downside nyata adalah bahwa bilah status terlihat sangat singkat saat aplikasi memuat. Untuk kebutuhan saya, itu bukan masalah.
sumber
Saya telah mencoba semua jawaban yang mungkin dari stackOverflow, akhirnya saya menyelesaikannya setelah seminggu pencarian panjang. Saya telah menggunakan tata letak koordinat dan saya mengubahnya dengan linearLayout dan masalah saya sudah diperbaiki. Saya tidak tahu mungkin tata letak koordinat memiliki bug atau kesalahan saya.
sumber
Saya mencoba banyak solusi termasuk Joseph Johnson dan Johan Stuyts's. Tetapi sebagai hasilnya saya mendapat ruang putih antara konten dan keyboard pada beberapa perangkat (seperti Lenovo s820) dalam semua kasus. Jadi saya membuat beberapa perubahan pada kode mereka dan akhirnya mendapatkan solusi yang berfungsi.
Ide saya didasarkan pada penambahan margin ke atas konten saat keyboard ditampilkan.
Seperti yang Anda lihat, saya menambahkan 30 px ke perbedaan karena ada ruang putih kecil antara bagian atas layar dan zona konten dengan margin. Dan saya tidak tahu dari mana itu muncul jadi saya memutuskan untuk membuat margin lebih kecil dan sekarang berfungsi persis seperti yang saya butuhkan.
sumber
Hari ini tidak berfungsi adjustResize pada masalah layar penuh sebenarnya untuk sdk android.
Dari jawaban yang saya temukan:
solusinya - tetapi solusinya ada pada masalah gambar:
Daripada saya menemukan solusi dan menghapus satu tindakan yang tidak perlu:
Jadi, lihat kode solusi tetap saya di Kotlin:
Kode implementasi perbaikan bug saya:
sumber
Jangan gunakan:
karena bekerja buruk. Alih-alih itu, gunakan:
sumber
Dalam kasus saya, masalah ini mulai terjadi setelah saya menambahkan Crosswalk ke aplikasi Cordova saya. Aplikasi saya tidak digunakan dalam layar penuh dan android: windowSoftInputMode = "AdjustPan".
Saya sudah memiliki plugin keyboard ionik dalam aplikasi, jadi mendeteksi apakah keyboard naik atau turun mudah berkat itu:
Saya mencoba semua perbaikan di atas tetapi baris sederhana yang akhirnya melakukannya untuk saya adalah css ini:
Semoga ini menyelamatkan Anda beberapa hari saya habiskan untuk ini. :)
sumber