Primeiro um pouco de fundo:
Eu tenho um layout dentro de uma scrollview. Inicialmente, quando o usuário rola na tela, a exibição de rolagem rola. No entanto, após uma certa quantidade de rolagem, desativei a rolagem na exibição de rolagem e movi o "foco da rolagem" para uma visualização da web dentro do layout filho. Dessa forma, o scrollview adere e todos os eventos de rolagem vão para o webview dentro dele.
Portanto, para uma solução, quando o limite de rolagem é atingido, removo o layout filho da scrollview e o coloco no pai da scrollview (e torno a scrollview invisível).
// 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);
Ideia geral: (-> meios contém)
Antes: parentlayout -> scrollview -> scrollChildLayout
Depois: parentLayout -> scrollChildLayout
O código acima está me dando essa exceção:
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)
Você sabe o que está acontecendo? Estou claramente chamando removeView no pai.
fonte
scrollView.removeView(scrollChildLayout)
tenta remover a criança de scrollView, para não remover o próprio scrollView de sua ViewGroup paiif (mAdView.getParent()!=null) ((ViewGroup) mAdView.getParent()).removeView(mAdView);
Tente remover o scrollChildLayout da visualização principal primeiro?
Ou remova todo o filho da exibição pai e adicione-o novamente.
fonte
No onCreate com atividade ou no onCreateView com fragmento.
fonte
Ok, me chame de paranóico, mas sugiro:
fundição sem
instanceof
apenas parece errado. E (obrigado IntelliJ IDEA por me dizer)removeView
faz parte daViewManager
interface. E não se deve converter para uma classe concreta quando uma interface perfeitamente adequada estiver disponível.fonte
Tudo o que você precisa fazer é postar () um Runnable que faça o addView ().
fonte
Eu estava chamando parentView.removeView (childView) e childView ainda estava sendo exibido. Acabei percebendo que um método estava sendo disparado duas vezes e adicionei o childView ao parentView duas vezes.
Portanto, use parentView.getChildCount () para determinar quantos filhos o pai tem antes de adicionar uma exibição e depois. Se o filho for adicionado muitas vezes, o filho mais importante será removido e a cópia childView permanecerá - que parece que removeView está funcionando mesmo quando está.
Além disso, você não deve usar o View.GONE para remover uma exibição. Se ele for realmente removido, você não precisará escondê-lo; caso contrário, ele ainda estará lá e você estará escondendo de si mesmo :(
fonte
No meu caso, tenho BaseFragment e todos os outros fragmentos herdam disso.
Então, minha solução foi adicionar essas linhas no
OnDestroyView()
métodofonte
Solução Kotlin
Kotlin simplifica a conversão pai com
as?
, retornando nulo se o lado esquerdo for nulo ou a conversão falhar.Solução de extensão Kotlin
Se você deseja simplificar ainda mais isso, você pode adicionar esta extensão.
Ele não fará nada com segurança se essa Visualização for nula, a visualização pai for nula ou a visualização pai não for um ViewGroup
fonte
Você também pode fazer isso verificando se o método indexOfView do View se o método indexOfView retorna -1, então podemos usar.
DesanexarViewFromParent (v) do ViewGroup; seguido pelo removeDetachedView do ViewGroup (v, true / false);
fonte
O que eu estava fazendo de errado, por isso, recebi esse erro é que não estava instanciando o layout dinâmico e adicionando childs a ele.
fonte
Aqui está a minha solução.
Digamos que você tenha dois
TextViews
e coloque-os em umLinearLayout
(nomeadoll
). Você vai colocar issoLinerLayout
em outroLinerLayout
.Quando você deseja criar essa estrutura, precisa fornecer o pai como herança.
Se você quiser usá-lo em um
onCreate
métodothis
será suficiente.Caso contrário, aqui está a solição:
fonte