Saya memiliki masalah dengan actionbar / navbar tembus di Android KitKat baru (4.4) dan windowSoftInputMode="adjustResize"
.
Normaly mengubah InputMode untuk menyesuaikanResize, aplikasi harus mengubah ukuran sendiri ketika keyboard ditampilkan ... tetapi di sini tidak akan! Jika saya menghapus garis untuk efek transparan, ukurannya berfungsi.
Jadi jika keyboard terlihat, ListView saya ada di bawahnya dan saya tidak dapat mengakses beberapa item terakhir. (Hanya dengan menyembunyikan keyboard secara manual)
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="XYZ"
android:versionCode="23"
android:versionName="0.1" >
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.XYZStyle" >
<activity
android:name="XYZ"
android:label="@string/app_name"
android:windowSoftInputMode="adjustResize" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
values-v19 / styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.XYZStyle" parent="@style/Theme.AppCompat.Light">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
</style>
</resources>
fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/listView_contacts"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:divider="@null"
android:dividerHeight="0dp"
android:drawSelectorOnTop="true"
android:fastScrollAlwaysVisible="true"
android:fastScrollEnabled="true"
android:paddingBottom="@dimen/navigationbar__height" >
</ListView>
</RelativeLayout>
Adakah ide untuk memperbaikinya?
Jawaban:
Anda kehilangan properti berikut:
di root
RelativeLayout
dari fragmen tata letak xml.Memperbarui:
Tahun lalu ada pembicaraan menarik oleh Chris Bane yang menjelaskan dengan sangat rinci bagaimana ini bekerja:
https://www.youtube.com/watch?v=_mGDMVRO3iE
sumber
Ada laporan bug terkait di sini . Saya telah menemukan solusi yang, dari pengujian terbatas, tampaknya melakukan trik tanpa dampak. Tambahkan implementasi kustom root Anda
ViewGroup
(saya hampir selalu menggunakanFrameLayout
, jadi ini yang saya uji dengan) dengan logika di bawah ini. Kemudian, gunakan tata letak khusus ini sebagai pengganti tata letak root Anda, dan pastikan Anda mengaturandroid:fitsSystemWindows="true"
. Anda kemudian dapat memanggilgetInsets()
kapan saja setelah tata letak (misalnya menambahkanOnPreDrawListener
) untuk menyesuaikan sisa tata letak Anda dengan memperhitungkan insets sistem, jika diinginkan.Karena
fitSystemWindow
s sudah tidak digunakan lagi, silakan merujuk ke jawaban di bawah ini untuk menyelesaikan solusinya.sumber
Jawaban @kcoppock sangat membantu, tetapi fitSystemWindows sudah tidak digunakan lagi di API level 20
Jadi sejak API 20 (KITKAT_WATCH) Anda harus menimpa onApplyWindowInsets
sumber
ViewCompat.setOnApplyWindowInsetsListener
dispatchApplyWindowInsets
sebaliknya (kode yang sama) bekerja untuk sayaIni berfungsi agar saya memiliki bilah status transparan dan sesuaikanResifikasi dalam fragmen:
Buat RelativeLayout khusus seperti yang dikatakan @ Victor91 dan @kcoppock.
Gunakan CustomRelativeLayout sebagai tata letak induk untuk fragmen Anda.
Nyatakan tema dengan android: windowTranslucentStatus = true
Kegiatan wadah harus dideklarasikan dalam Manifest dengan android: windowSoftInputMode = "AdjustResize" dan gunakan tema yang dideklarasikan
Silakan Gunakan cocokSystemWindows pada tata letak root fragmen!
Kemudian dalam xml,
sumber
Jika Anda ingin menyesuaikan insets dan Anda menargetkan level API> = 21 Anda dapat melakukannya tanpa harus membuat grup tampilan kustom. Dengan hanya mengatur
fitsSystemWindows
pelapis akan diterapkan ke tampilan wadah Anda secara default, yang mungkin tidak Anda inginkan.Pemeriksaan versi dibuat dalam metode ini dan hanya perangkat> = 21 yang akan menjalankan kode di dalam lambda. Contoh Kotlin:
Pastikan tata letak Anda masih menetapkan
fitsSystemWindows
bendera, jika tidak pendengar inset jendela tidak akan dipanggil.Sumber-sumber ini sangat membantu:
https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec https://medium.com/@azizbekian/windowinsets-24e241d4afb9
sumber
BaseFragment
, bersamaview.fitsSystemWindows = true
dan itu hanya berfungsi tanpa perubahan pada tata letak XML aktual atau Lihat subkelas.Saya memiliki masalah yang sama, Aktivitas Saya memiliki ScrollView sebagai tampilan root dan dengan statusbar transparan diaktifkan tidak mengubah ukuran dengan benar ketika keyboard menunjukkan ... dan secara konsisten layar tidak menggulir menyembunyikan tampilan input.
Solusi: Memindahkan semuanya (tata letak dan logika aktivitas) di dalam Fragmen baru. Kemudian ubah Kegiatan hanya untuk menyertakan Fragmen ini. Sekarang semuanya berjalan seperti yang diharapkan!
Ini adalah tata letak aktivitas:
sumber
Berdasarkan solusi Joseph Johnson di Android Cara menyesuaikan tata letak dalam Mode Layar Penuh ketika papan tombol terlihat
panggil ini
onCreate()
setelahsetContentView()
aktivitas Anda.AndroidBug5497Workaround.assistActivity(this);
litte berbeda dari yang asli ganti
return (r.bottom - r.top);
denganreturn r.bottom;
incomputeUsableHeight()
untuk beberapa alasan, saya harus mengatur
fitsSystemWindows
atribut aktivitas sayafalse
.solusi ini menyelamatkan saya. ini bekerja dengan baik untuk saya. semoga dapat membantu anda
kelas implementasi adalah:
sumber
Seharusnya tidak bekerja dengan bilah status transparan; pengaturan yang memaksa jendela ke mode layar penuh yang tidak bekerja dengan adjustResize.
Anda bisa menggunakan AdjustPan atau menggunakan properti fitsSystemWindows. Saya sarankan membaca tentang fitur ini, ia memiliki efek samping yang signifikan:
https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec
sumber
AndroidBug5497Workaround.java berhati-hati dengan kebocoran memori. perlu kode di bawah ini
Sampel saya menggunakan RxJava yang secara otomatis memanggil removeOnGlobalLayoutListener () ketika onPause () dalam siklus hidup Activity
sumber
Saya punya masalah.
Saya mengatur windowDrawsSystemBarBackgrounds ke 'true' dan aplikasi saya akan ditampilkan di bawah bilah status.
Itu tema aktivitas saya.
dan saya mendapat bantuan dari blog jianshu . Anda dapat membaca kode tetapi teks seperti saya. Saya menambahkan beberapa kode lagi.
Ini adalah tata letak fragmen saya.
Saya ingin ini membantu Anda. semoga berhasil!
sumber
sumber
Saya memiliki masalah yang sama. Saya telah memecahkan masalah menggunakan coordinatorlayout
activity.main.xml
content_main2.xml
MainActivity.java
sekarang tambahkan baris ini linearLayoutManager.setStackFromEnd (true);
sumber
sumber
Tambahkan ini dulu di tata letak root Anda.
Saat Anda menggunakan pendekatan ini, menjadi tanggung jawab Anda untuk memastikan bahwa bagian-bagian penting dari UI aplikasi Anda (misalnya, kontrol bawaan dalam aplikasi Maps) tidak berakhir dengan diliputi oleh bilah sistem. Ini bisa membuat aplikasi Anda tidak dapat digunakan. Dalam kebanyakan kasus, Anda dapat menangani ini dengan menambahkan atribut android: fitsSystemWindows ke file tata letak XML Anda, atur true. Ini menyesuaikan bantalan ViewGroup induk untuk memberikan ruang bagi sistem windows. Ini cukup untuk sebagian besar aplikasi.
Namun, dalam beberapa kasus, Anda mungkin perlu memodifikasi lapisan default untuk mendapatkan tata letak yang diinginkan untuk aplikasi Anda. Untuk memanipulasi secara langsung bagaimana konten Anda ditampilkan relatif terhadap bilah sistem (yang menempati ruang yang dikenal sebagai "insets konten" jendela), ganti fitSystemWindows (insets persegi). Metode fitSystemWindows () dipanggil oleh hierarki tampilan ketika inset konten untuk jendela telah berubah, untuk memungkinkan jendela menyesuaikan isinya. Dengan mengganti metode ini Anda dapat menangani insets (dan karenanya tata letak aplikasi Anda) seperti yang Anda inginkan.
https://developer.android.com/training/system-ui/status#behind
Jika Anda ingin menjadi tukang jendela utama, silakan tonton video dari pengembang android. https://www.youtube.com/watch?v=_mGDMVRO3iE
sumber
Praktik terbaik memungkinkan konten gulir pengguna saat keyboard ditampilkan. Jadi untuk menambahkan fungsi ini Anda perlu meletakkan tata letak root Anda di dalam
ScrollView
dan gunakanwindowSoftInputMode="adjustResize"
metode aktivitas.Tetapi jika Anda ingin menggunakan fungsi ini dengan
<item name="android:windowTranslucentStatus">true</item>
flag pada Android 5 konten tidak akan dapat digulir dan akan tumpang tindih dengan keyboard.Untuk mengatasi masalah ini, periksa jawaban ini
sumber