Pertama sedikit latar belakang:
Saya memiliki tata letak di dalam scrollview. Pada awalnya, ketika pengguna menggulir di layar, scrollview akan bergulir. Namun, setelah sejumlah gulir, saya harus menonaktifkan gulir pada gulir, melihat pindahkan "gulir fokus" ke tampilan web di dalam tata letak anak. Dengan cara ini, scrollview stick dan semua acara scroll pergi ke tampilan web di dalamnya.
Jadi, untuk solusi, ketika ambang gulir tercapai, saya menghapus tata letak anak dari scrollview dan meletakkannya di induk scrollview. (Dan membuat scrollview tidak terlihat).
// Remove the child view from the scroll view
scrollView.removeView(scrollChildLayout);
// Get scroll view out of the way
scrollView.setVisibility(View.GONE);
// Put the child view into scrollview's parent view
parentLayout.addView(scrollChildLayout);
Gagasan Umum: (-> berarti mengandung)
Sebelum: parentlayout -> scrollview -> scrollChildLayout
Setelah: parentLayout -> scrollChildLayout
Kode di atas memberi saya pengecualian ini:
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
at android.view.ViewGroup.addViewInner(ViewGroup.java:1976)
at android.view.ViewGroup.addView(ViewGroup.java:1871)
at android.view.ViewGroup.addView(ViewGroup.java:1828)
at android.view.ViewGroup.addView(ViewGroup.java:1808)
Apakah Anda tahu apa yang sedang terjadi? Saya jelas memanggil removeView pada induknya.
sumber
scrollView.removeView(scrollChildLayout)
mencoba menghapus anak scrollView, bukan menghapus scrollView itu sendiri dari induknya ViewGroupif (mAdView.getParent()!=null) ((ViewGroup) mAdView.getParent()).removeView(mAdView);
Coba hapus scrollChildLayout dari tampilan induknya terlebih dahulu?
Atau hapus semua anak dari tampilan induk, dan tambahkan lagi.
sumber
Di onCreate dengan aktivitas atau di onCreateView dengan fragmen.
sumber
Ok, panggil aku paranoid tapi aku sarankan:
casting tanpa
instanceof
sepertinya salah. Dan (terima kasih IntelliJ IDEA karena memberi tahu saya)removeView
adalah bagian dariViewManager
antarmuka. Dan seseorang seharusnya tidak menggunakan kelas beton ketika antarmuka yang sangat cocok tersedia.sumber
Yang harus Anda lakukan adalah memposting () suatu Runnable yang melakukan addView ().
sumber
Saya menelepon parentView.removeView (childView) dan childView masih ditampilkan. Saya akhirnya menyadari bahwa suatu metode entah bagaimana dipicu dua kali dan menambahkan childView ke parentView dua kali.
Jadi, gunakan parentView.getChildCount () untuk menentukan berapa banyak anak yang dimiliki orang tua sebelum Anda menambahkan tampilan dan sesudahnya. Jika anak ditambahkan terlalu banyak maka anak paling atas sedang dihapus dan salinan childView tetap ada - yang tampak seperti removeView berfungsi bahkan ketika itu.
Selain itu, Anda tidak boleh menggunakan View.GONE untuk menghapus tampilan. Jika itu benar-benar dihapus maka Anda tidak perlu menyembunyikannya, kalau tidak itu masih ada dan Anda hanya menyembunyikannya dari diri sendiri :(
sumber
Dalam kasus saya, saya memiliki BaseFragment dan semua fragmen lain dari ini.
Jadi solytion saya adalah menambahkan baris ini dalam
OnDestroyView()
metodesumber
Solusi Kotlin
Kotlin menyederhanakan casting orangtua dengan
as?
, mengembalikan nol jika sisi kiri adalah nol atau gips gagal.Solusi Ekstensi Kotlin
Jika Anda ingin menyederhanakan ini lebih jauh, Anda dapat menambahkan ekstensi ini.
Ini tidak akan melakukan apa pun jika Tampilan ini adalah nol, tampilan induk adalah nol, atau tampilan induk bukan merupakan ViewGroup
sumber
Anda juga dapat melakukannya dengan memeriksa apakah metode indexOfView View jika metode indexOfView mengembalikan -1 maka kita dapat menggunakan.
DetachViewFromParent ViewGroup (v); diikuti oleh removeDetachedView dari ViewGroup (v, true / false);
sumber
Apa yang saya lakukan salah jadi saya mendapatkan kesalahan ini adalah saya tidak instantiating tata letak dinamis dan menambahkan childs ke dalamnya sehingga mendapat kesalahan ini
sumber
Ini solusinya.
Katakanlah Anda memiliki dua
TextViews
dan menaruhnya diLinearLayout
(bernamall
). Anda akan menempatkan iniLinerLayout
di yang lainLinerLayout
.Saat Anda ingin membuat struktur ini, Anda harus memberikan induk sebagai warisan.
Jika Anda ingin menggunakannya dalam suatu
onCreate
metodethis
akan cukup.Kalau tidak di sini solition:
sumber