Najpierw małe tło:Zadzwoń removeView() na rodzica dziecka najpierw
Mam układ wewnątrz przewijania. Na początku, gdy użytkownik przewija ekran, przewijanie przewija. Jednak po pewnym przewinięciu miałem wyłączyć przewijanie w widoku przewijania i przesunąć "ognisko przewijania" na widok internetowy w układzie podrzędnym. W ten sposób przewijany widok i wszystkie zdarzenia przewijania przechodzą do widoku w środku.
Jeśli chodzi o rozwiązanie, po osiągnięciu progu przewijania usuwam układ podrzędny z przewijania i umieszczam go w elemencie nadrzędnym scrollview (i spraw, aby widok przewijania był niewidoczny).
// 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);
ogólna idea: (-> środek zawiera)
Przed: parentlayout -> Scrollview -> scrollChildLayout
Po: parentLayout -> scrollChildLayout
Powyższy kod daje mi to wyjątek:
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)
Czy wiesz, co się dzieje? Wyraźnie nazywam removeView na rodzica.
+1 getParent() to klejnot tutaj. –
Rozwiązanie jest prawidłowe, ale dlaczego "scollView.removeView (scrollChildLayout)" nie działa? Czy te dwie linie nie powinny być takie same? –
@ andrea.spot, wydaje się, że 'scrollView.removeView (scrollChildLayout)' próbuje usunąć dziecko scrollView, a nie usunąć samego scrollView z jego rodzica ViewGroup –