2014-05-21 2 views
8

이 작업을 수행하는 데 부울 메서드가 없습니다. viewStubidinflatedid으로 지정된 것으로 변경되었는지 확인하여이 작업을 수행 할 수 있습니까?viewStub가 이미 팽창되어 있는지 확인하는 방법은 무엇입니까?

Javacode :

protected void plantViewTree() { 
    // TODO Auto-generated method stub 

     ViewStub mViewstub = (ViewStub) findViewById(R.id.viewStub00); 

      if (mViewStub is inflated) { 
       //do somthing 
       }else 
       mViewstub.inflate(); 

} 

업데이트 이 코드에 따르면 일 eOutput

댓글은 toast 항상 mViewStub 이후 의미의 메시지가 findViewById에 할당 된 표시 그 언더 레이 alyout의 viewstub보기를 사용할 수 없다는 점을 제외하고는 null이 아닙니다. 어떤 제안.? 구글

protected void plantViewTree() { 
    // TODO Auto-generated method stub 
    ViewStub mViewstub = (ViewStub) findViewById(R.id.viewStub00); 
    if (mViewstub != null) 
     Toast.makeText(getApplicationContext(), "view is inflated", 
Toast.LENGTH_LONG).show(); 
    else 
     mViewstub.inflate(); 
} 
+0

팽창되지 않으면 null이됩니다. null인지 아닌지 확인할 수 있습니다. –

+0

@ Eu.Dr. – LetsamrIt

답변

2

참고

ViewStub이 표시된다

또는 부풀려() 호출은 레이아웃 리소스가 팽창된다.

그래서 공개 여부를 확인하거나 "null"인지 확인해 볼 수 있습니다.

+0

업데이 트 – LetsamrIt

+0

이 참이 아니고, 뷰 스타브가 비정상적으로 늘어 났을 때 null이 아니어야합니다. – Sniper

-5

flags을 사용하여 해결했습니다.

//declaration of the variable 
private boolean isInflatedBefore = false 

... 
... 
... 

protected void plantViewTree() { 
    // TODO Auto-generated method stub 

    ViewStub mViewstub = (ViewStub) findViewById(R.id.viewStub00); 

    if (! isInflatedBefore) { 
     isInflatedBefore = true; 
     mViewstub.inflate(); 
       }else { 
       //some code 
       } 
14

우리는 가장 중요한 방법은 inflate()입니다

public View inflate() { 
    final ViewParent viewParent = getParent(); 

    if (viewParent != null && viewParent instanceof ViewGroup) { 
     if (mLayoutResource != 0) { 
      final ViewGroup parent = (ViewGroup) viewParent; 
      final LayoutInflater factory; 
      if (mInflater != null) { 
       factory = mInflater; 
      } else { 
       factory = LayoutInflater.from(mContext); 
      } 
      final View view = factory.inflate(mLayoutResource, parent, 
        false); 

      if (mInflatedId != NO_ID) { 
       view.setId(mInflatedId); 
      } 

      final int index = parent.indexOfChild(this); 
      parent.removeViewInLayout(this); 

      final ViewGroup.LayoutParams layoutParams = getLayoutParams(); 
      if (layoutParams != null) { 
       parent.addView(view, index, layoutParams); 
      } else { 
       parent.addView(view, index); 
      } 

      mInflatedViewRef = new WeakReference<View>(view); 

      if (mInflateListener != null) { 
       mInflateListener.onInflate(this, view); 
      } 

      return view; 
     } else { 
      throw new IllegalArgumentException("ViewStub must have a valid layoutResource"); 
     } 
    } else { 
     throw new IllegalStateException("ViewStub must have a non-null ViewGroup viewParent"); 
    } 
} 

공지 사항이 줄을 ViewStub 소스 코드를 볼 수 있습니다 : 나는 글로벌 부울 변수 isInflatedBefore

코드 false에 처음 을 설정 선언 parent.removeViewInLayout(this), inflate.so 이후 레이아웃에서 제거되었으므로 viewStub가 이미 이렇게 팽창되었는지 확인할 수 있습니다.

if (mViewStub.getParent() != null) { 
    mViewStub.inflate(); 
} else { 
    mViewStub.setVisibility(View.VISIBLE); 
} 
+1

viewstub가 완료되면 viewstub가 완료됩니다. mViewStub.getParent()! = null, 작업이 완료되지 않은 경우 null입니다. 부모가 될 것입니다! = null 그렇지 않으면 부모가 null이됩니다 – Sniper

+0

매력처럼 작동합니다. –

1

yourViewStub.visibility(View.VISIBLE) 전화가 부풀어 오르고 있는지 확인하지 않아도됩니다.

+0

똑같은 호감을 얻었습니다. –

0
if (mViewStub.getParent() != null) { 
    //have not been inflated 
    mViewStub.inflate(); 
} else { 
    //already inflated 
} 
관련 문제