1. ホーム
  2. android

[解決済み] まず子の親でremoveView()を呼び出す

2022-02-07 12:40:58

質問

まず、背景を少し説明します。

私はスクロールビューの中にレイアウトを持っています。最初は、ユーザーが画面をスクロールすると、スクロールビューがスクロールします。しかし、ある程度スクロールしたら、スクロールビューのスクロールを無効にして、"スクロールフォーカス"を子レイアウト内のウェブビューに移動させることにしました。こうすることで、スクロールビューが固定され、すべてのスクロールイベントがその中のウェブビューに行くようになります。

そこで、解決策として、スクロールのしきい値に達したときに、スクロールビューから子レイアウトを削除して、スクロールビューの親に配置します(そしてスクロールビューを不可視にします)。

// 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);

一般的な考え方 (-> 含むという意味)

前:parentlayout -> scrollview -> scrollChildLayout

後:parentLayout -> scrollChildLayout

上記のコードでは、この例外が発生します。

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)

何が起こっているか分かりますか?私は明らかに親にremoveViewを呼び出しています。

どうすればいいですか?

解決方法

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

子要素を使用して、親への参照を取得します。親要素をViewGroupにキャストして、removeViewメソッドにアクセスできるようにし、それを使用します。

解決策を提供してくれた@Dongshengcnに感謝します。