먼저 자녀의 부모에서 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 덕분에) removeView
는 ViewManager
인터페이스의 일부입니다 . 완벽하게 적합한 인터페이스를 사용할 수있을 때 구체적인 클래스로 캐스트해서는 안됩니다.
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
'IT story' 카테고리의 다른 글
UILabel 주위에 테두리를 그리는 방법은 무엇입니까? (0) | 2020.06.25 |
---|---|
오류 : com.android.tools.aapt2.Aapt2Exception : AAPT2 오류 : 자세한 내용은 로그 확인 (0) | 2020.06.25 |
Perl 프로그램에 명령 행 인수를 전달하려면 어떻게해야합니까? (0) | 2020.06.25 |
GitHub 프로젝트에서 특정 커밋을 얻는 방법 (0) | 2020.06.25 |
예제가 포함 된 JavaScript 모듈 패턴 [닫힘] (0) | 2020.06.24 |