IT story

먼저 자녀의 부모에서 removeView ()를 호출하십시오.

hot-time 2020. 6. 25. 07:50
반응형

먼저 자녀의 부모에서 removeView ()를 호출하십시오.


먼저 작은 배경 :

스크롤보기 안에 레이아웃이 있습니다. 처음에 사용자가 화면을 스크롤하면 스크롤보기가 스크롤됩니다. 그러나 일정량의 스크롤 후, 스크롤보기에서 스크롤을 비활성화하고 "스크롤 포커스"를 자식 레이아웃 내부의 웹 뷰로 이동했습니다. 이렇게하면 스크롤보기가 고정되고 모든 스크롤 이벤트가 내부의 웹보기로 이동합니다.

따라서 솔루션의 경우 스크롤 임계 값에 도달하면 스크롤보기에서 자식 레이아웃을 제거하고 스크롤보기의 부모에 배치합니다 (스크롤보기를 보이지 않게 만듭니다).

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

자식 요소를 사용하여 부모에 대한 참조를 얻습니다. removeView 메소드에 액세스하여 사용할 수 있도록 상위를 ViewGroup으로 캐스트하십시오.

솔루션을위한 @Dongshengcn에게 감사합니다


먼저 부모보기에서 scrollChildLayout을 제거 해보십시오.

scrollview.removeView(scrollChildLayout)

또는 부모보기에서 모든 자식을 제거하고 다시 추가하십시오.

scrollview.removeAllViews()

활동으로 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) {

}

좋아, 편집증이라고 부르지 만 나는 제안한다.

  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 덕분에) removeViewViewManager인터페이스의 일부입니다 . 완벽하게 적합한 인터페이스를 사용할 수있을 때 구체적인 클래스로 캐스트해서는 안됩니다.


addView ()를 수행하는 Runnable을 post () 만하면됩니다.


I was calling parentView.removeView(childView) and childView was still showing. I eventually realized that a method was somehow being triggered twice and added the childView to the parentView twice.

So, use parentView.getChildCount() to determine how many children the parent has before you add a view and afterwards. If the child is added too many times then the top most child is being removed and the copy childView remains-which looks like removeView is working even when it is.

Also, you shouldn't use View.GONE to remove a view. If it's truly removed then you won't need to hide it, otherwise it's still there and you're just hiding it from yourself :(


In my case , I have BaseFragment and all other fragment inherits from this.

So my solytion was add this lines in OnDestroyView() method

@Override
public final View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    if (mRootView == null)
    {
        mRootView = (inflater == null ? getActivity().getLayoutInflater() : inflater).inflate(mContentViewResourceId, container, false);
    }
....////
}

@Override
public void onDestroyView()
{
    if (mRootView != null)
    {
        ViewGroup parentViewGroup = (ViewGroup) mRootView.getParent();

        if (parentViewGroup != null)
        {
            parentViewGroup.removeAllViews();
        }
    }

    super.onDestroyView();
}

You can also do it by checking if View's indexOfView method if indexOfView method returns -1 then we can use.

ViewGroup's detachViewFromParent(v); followed by ViewGroup's removeDetachedView(v, true/false);


What I was doing wrong so I got this error is I wasn't instantiating dynamic layout and adding childs to it so got this error


Here is my solution.

Lets say you have two TextViews and put them on a LinearLayout (named ll). You'll put this LinerLayout on another LinerLayout.

< lm Linear Layout> 
       < ll Linear Layout> 
             <name Text view>
             </name Text view>
             <surname Text view>
             </surname Text view>
       </ll Linear Layout> 
</lm Linear Layout> 

When you want to create this structure you need to give parent as inheritance.

If you want use it in an onCreate method this will enough.

Otherwise here is solition:

LinerLayout lm = new LinearLayout(this); // You can use getApplicationContext() also
LinerLayout ll = new LinearLayout(lm.getContext());
TextView name = new TextView(ll.getContext());
TextView surname = new TextView(ll.getContext());

참고URL : https://stackoverflow.com/questions/6526874/call-removeview-on-the-childs-parent-first

반응형