Сначала вызовите removeView() родительского родителя

Сначала немного фона:

У меня есть макет внутри scrollview. Сначала, когда пользователь прокручивается на экране, свиток scrollview. Однако после определенного количества прокрутки я должен был отключить прокрутку в прокрутке, чтобы переместить "scroll focus" на веб-просмотр внутри дочернего макета. Таким образом, кнопки scrollview и все события прокрутки переходят в веб-просмотр внутри него.

Итак, для решения, когда достигается порог прокрутки, я удаляю дочерний макет из прокрутки и помещаю его в родительский элемент scrollview. (И сделать невидимым прокрутку).

// 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 parent view
parentLayout.addView(scrollChildLayout);

Общая идея: (- > содержит средства)

До: parentlayout → scrollview → scrollChildLayout

После: parentLayout → scrollChildLayout

Приведенный выше код дает мне это исключение:

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child 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)

Знаешь, что происходит? Я ясно вызываю removeView для родителя.

Ответ 1

Решение:

((ViewGroup)scrollChildLayout.getParent()).removeView(scrollChildLayout);
//scrollView.removeView(scrollChildLayout);

Используйте дочерний элемент, чтобы получить ссылку на родителя. Переместите родителя в ViewGroup, чтобы получить доступ к методу removeView и использовать его.

Благодаря @Dongshengcn для решения

Ответ 2

Попробуйте сначала удалить scrollChildLayout из родительского представления?

scrollview.removeView(scrollChildLayout)

Или удалите все дочерние элементы из родительского представления и добавьте их снова.

scrollview.removeAllViews()

Ответ 3

В onCreate с активностью или в onCreateView с фрагментом.

 if (view != null) {
    ViewGroup parent = (ViewGroup) view.getParent();
    if (parent != null) {
        parent.removeView(view);
    }
}
try {
    view = inflater.inflate(R.layout.fragment_main, container, false);
} catch (InflateException e) {

}

Ответ 4

Хорошо, назовите меня параноидальным, но я предлагаю:

  final android.view.ViewParent parent = view.getParent ();

  if (parent instanceof android.view.ViewManager)
  {
     final android.view.ViewManager viewManager = (android.view.ViewManager) parent;

     viewManager.removeView (view);
  } // if

литье без instanceof просто кажется неправильным. И (спасибо IntelliJ IDEA за рассказ) removeView является частью интерфейса ViewManager. И не следует бросать в конкретный класс, когда доступен совершенно подходящий интерфейс.

Ответ 5

Все, что вам нужно сделать, это post() Runnable, который делает addView().

Ответ 6

Я вызывал parentView.removeView(childView), и childView все еще показывал. В конце концов я понял, что метод каким-то образом запускается дважды и дважды добавляет childView к parentView.

Итак, используйте parentView.getChildCount(), чтобы определить, сколько детей у родителя, прежде чем добавлять представление и впоследствии. Если дочерний элемент добавлен слишком много раз, то самый верхний ребенок удаляется, и копия childView остается - что выглядит как removeView, работает даже тогда, когда оно есть.

Кроме того, вы не должны использовать View.GONE для удаления представления. Если он действительно удален, вам не нужно будет скрывать его, иначе он все еще существует, и вы просто скрываете его от себя: (

Ответ 7

Вы также можете сделать это, проверив, является ли метод View indexOfView если метод indexOfView возвращает -1, мы можем использовать.

ViewGroup detachViewFromParent (v); с последующим ViewGroup removeDetachedView (v, true/false);

Ответ 8

Что я делал неправильно, поэтому я получил эту ошибку: я не создавал динамический макет и не добавлял в него дочерние элементы, поэтому получил эту ошибку