Saya telah menghabiskan sekitar 6 jam sejauh ini, dan tidak menemukan apa-apa selain rintangan. Premis umumnya adalah bahwa ada beberapa baris dalam a ListView
(apakah itu dibuat oleh adaptor, atau ditambahkan sebagai tampilan header) yang berisi EditText
widget dan file Button
. Yang ingin saya lakukan adalah dapat menggunakan jogball / panah, untuk menavigasi selektor ke item individual seperti biasa, tetapi ketika saya sampai ke baris tertentu - bahkan jika saya harus secara eksplisit mengidentifikasi baris - yang memiliki fokus yang dapat difokuskan Nak, saya ingin anak itu mengambil fokus daripada menunjukkan posisi dengan selektor.
Saya sudah mencoba banyak kemungkinan, dan sejauh ini tidak berhasil.
tata letak:
<ListView
android:id="@android:id/list"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
/>
Tampilan header:
EditText view = new EditText(this);
listView.addHeaderView(view, null, true);
Dengan asumsi ada item lain di adaptor, menggunakan tombol panah akan memindahkan pilihan ke atas / bawah dalam daftar, seperti yang diharapkan; tetapi ketika sampai ke baris header, itu juga ditampilkan dengan selektor, dan tidak ada cara untuk fokus ke dalam EditText
menggunakan jogball. Catatan: mengetuk pada EditText
akan memfokuskannya pada saat itu, namun itu bergantung pada layar sentuh, yang seharusnya tidak menjadi persyaratan.
ListView
rupanya memiliki dua mode dalam hal ini:
1 setItemsCanFocus(true)
.: selektor tidak pernah ditampilkan, tetapi EditText
bisa mendapatkan fokus saat menggunakan panah. Algoritme penelusuran fokus sulit untuk diprediksi, dan tidak ada umpan balik visual (pada baris mana pun: memiliki turunan yang dapat difokuskan atau tidak) pada item mana yang dipilih, yang keduanya dapat memberikan pengalaman yang tidak terduga kepada pengguna.
2 setItemsCanFocus(false)
.: selektor selalu digambar dalam mode non-sentuh, dan EditText
tidak pernah bisa mendapatkan fokus - bahkan jika Anda mengetuknya.
Untuk memperburuk keadaan, memanggil editTextView.requestFocus()
mengembalikan true, tetapi pada kenyataannya tidak memberikan fokus EditText.
Apa yang saya bayangkan pada dasarnya adalah gabungan dari 1 & 2, di mana daripada pengaturan daftar jika semua item dapat difokuskan atau tidak, saya ingin mengatur fokusabilitas untuk satu item dalam daftar, sehingga selektor transisi mulus dari memilih seluruh baris untuk item yang tidak dapat difokuskan, dan melintasi pohon fokus untuk item yang berisi turunan yang dapat difokuskan.
Ada yang mau?
descendantFocusability="afterDescendants"
akan memungkinkan EditText Anda untuk mengambil fokus di dalam ListView, tetapi kemudian Anda tidak mendapatkan pemilih item daftar saat menavigasi dengan dpad. Tugas saya adalah memiliki pemilih item daftar di semua baris kecuali satu dengan EditText. Senang itu membantu. FWIW, kami akhirnya mengevaluasi ulang implementasi ini dan memutuskan bahwa fokus di dalam ListView bukanlah desain UI Android idiomatis, jadi kami membatalkan ide tersebut untuk mendukung pendekatan yang lebih ramah Android.Ini membantu saya.
Dalam manifes Anda:
sumber
OnItemSelectedListener
tidak mengubah itu. Namun solusi sederhana Iogan bekerja seperti pesona, terima kasih!android:descendantFocusability
membuat sayaEditText
di dalamListView
menyelesaikan keyboard dengan benar, menaikkan suara keduanya.android:descendantFocusability
dengan sendirinya tidak melakukan trik dan saya tidak terlalu antusias@Overriding
onItemSelected
untuk semua 14 yangEditText
harus saya tangani. :) Terima kasih!Tugas saya adalah menerapkan
ListView
yang mengembang saat diklik. Ruang tambahan menunjukkanEditText
tempat Anda dapat memasukkan beberapa teks. Aplikasi harus berfungsi pada 2.2+ (hingga 4.2.2 pada saat penulisan ini)Saya mencoba berbagai solusi dari posting ini dan lainnya yang dapat saya temukan; mengujinya pada perangkat 2.2 hingga 4.2.2. Tidak ada solusi yang memuaskan di semua perangkat 2.2+, setiap solusi disajikan dengan masalah yang berbeda.
Saya ingin membagikan solusi terakhir saya:
android:descendantFocusability="afterDescendants"
setItemsCanFocus(true);
android:windowSoftInputMode="adjustResize"
Banyak orang menyarankanadjustPan
tetapiadjustResize
memberikan ux imho yang jauh lebih baik, cukup uji ini dalam kasus Anda. DenganadjustPan
Anda akan mendapatkan daftar item terbawah dikaburkan misalnya. Dokumen menyarankan itu ("Ini umumnya kurang diinginkan daripada mengubah ukuran"). Juga pada 4.0.4 setelah pengguna mulai mengetik pada keyboard lunak, layar bergeser ke atas.adjustResize
ada beberapa masalah dengan fokus EditText. Solusinya adalah menerapkan solusi rjrjr dari utas ini. Ini terlihat langka tapi sebenarnya tidak. Dan itu berhasil. Cobalah.Tambahan 5. Karena adaptor di-refresh (karena
EditText
perubahan ukuran tampilan) ketika mendapatkan fokus pada versi HoneyComb sebelumnya, saya menemukan masalah dengan tampilan terbalik: mendapatkan View untuk item ListView / urutan terbalik di 2.2; bekerja pada 4.0.3Jika Anda melakukan beberapa animasi, Anda mungkin ingin mengubah perilakunya
adjustPan
untuk versi pra-honeycomb sehingga pengubahan ukuran tidak diaktifkan dan adaptor tidak menyegarkan tampilan. Anda hanya perlu menambahkan sesuatu seperti iniSemua ini memberikan ux yang dapat diterima pada perangkat 2.2 - 4.2.2. Semoga ini akan menghemat waktu karena saya membutuhkan setidaknya beberapa jam untuk sampai pada kesimpulan ini.
sumber
Ini menyelamatkan hidupku --->
atur garis ini
ListView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
Kemudian di manifes Anda dalam tag aktivitas, ketik this ->
<activity android:windowSoftInputMode="adjustPan">
Niatmu yang biasa
sumber
Kami mencoba ini pada daftar pendek yang tidak melakukan daur ulang tampilan. Sejauh ini baik.
XML:
Jawa:
sumber
posting ini sama persis dengan kata kunci saya. Saya memiliki header ListView dengan EditText pencarian dan Tombol pencarian.
Untuk memberikan fokus pada EditText setelah kehilangan fokus awal, satu-satunya HACK yang saya temukan adalah:
Kehilangan banyak waktu dan itu bukan perbaikan yang nyata. Semoga bisa membantu seseorang yang tangguh.
sumber
Jika daftar tersebut dinamis dan berisi widget yang dapat difokuskan, maka opsi yang tepat adalah menggunakan RecyclerView, bukan IMO ListView.
Solusi yang mengatur
adjustPan
,FOCUS_AFTER_DESCENDANTS
atau mengingat posisi fokus secara manual, memang hanya solusi. Mereka memiliki kasus sudut (gulir + masalah keyboard lunak, posisi perubahan tanda sisipan di EditText). Mereka tidak mengubah fakta bahwa ListView membuat / menghancurkan tampilan secara massal selamanotifyDataSetChanged
.Dengan RecyclerView, Anda memberi tahu tentang penyisipan, pembaruan, dan penghapusan individual. Tampilan terfokus tidak dibuat ulang sehingga tidak ada masalah dengan kontrol formulir yang kehilangan fokus. Sebagai bonus tambahan, RecyclerView menganimasikan penyisipan dan penghapusan item daftar.
Berikut adalah contoh dari dokumen resmi tentang cara memulai
RecyclerView
: Panduan pengembang - Membuat Daftar dengan RecyclerViewsumber
beberapa kali saat Anda menggunakan
android:windowSoftInputMode="stateAlwaysHidden"
aktivitas manifes atau xml, saat itu fokus keyboard akan hilang. Jadi pertama-tama periksa properti itu di xml dan manifes Anda, jika ada, hapus saja. Setelah menambahkan opsi ini untuk memanifestasikan file di aktivitas sampingandroid:windowSoftInputMode="adjustPan"
dan menambahkan properti ini ke listview di xmlandroid:descendantFocusability="beforeDescendants"
sumber
Solusi sederhana lainnya adalah menentukan onClickListener Anda, dalam metode getView (..), ListAdapter Anda.
Dengan begitu baris Anda dapat diklik, dan tampilan dalam Anda juga :)
sumber
Bagian terpenting adalah membuat fokus berfungsi untuk sel daftar. Khusus untuk daftar di Google TV ini penting:
Metode setItemsCanFocus dari tampilan daftar melakukan trik:
Daftar sel xml saya dimulai seperti berikut:
nextFocusLeft / Right juga penting untuk navigasi D-Pad.
Untuk lebih jelasnya lihat jawaban hebat lainnya.
sumber
Saya baru saja menemukan solusi lain. Saya percaya ini lebih merupakan peretasan daripada solusi tetapi berfungsi pada android 2.3.7 dan android 4.3 (Saya bahkan telah menguji D-pad lama yang bagus itu)
init tampilan web Anda seperti biasa dan tambahkan ini: (terima kasih Michael Bierman)
Selama panggilan getView:
sumber
Coba saja ini
dalam
bagian dari manifes Anda. Ya, itu tidak menyesuaikan apa pun, yang berarti editText akan tetap di tempatnya saat IME dibuka. Tapi itu hanya sedikit ketidaknyamanan yang masih sepenuhnya menyelesaikan masalah kehilangan fokus.
sumber