2017-12-16 3 views
2

안드로이드 스튜디오 3.1, 자바 1.8예외 조각에 데이터 바인딩을 사용 : 나는 데이터 바인딩을 사용하려고

". 지정된 아이가 이미 부모가이 먼저 자녀의 부모에 removeView()를 호출해야한다"

여기 Settings.XML의 레이아웃 : 여기

<layout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto">  
    <data>  
     <variable 
      name="handler" 
      type="com.myproject.SettingsFragment" />  
    </data> 

    <android.support.constraint.ConstraintLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <ScrollView 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

      <FrameLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content"> 

       <android.support.constraint.ConstraintLayout 
        android:id="@+id/contentContainer" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent"> 


        <android.support.constraint.ConstraintLayout 
         android:id="@+id/contactUsContainer" 
         android:layout_width="match_parent" 
         android:layout_height="50dp" 
         android:onClick="@{handler::onClickContactUs}"> 

         <ImageView 
          android:id="@+id/contactUsImageView" 
          android:layout_width="28dp" 
          android:layout_height="28dp" 
          app:srcCompat="@drawable/ic_settings_contacts_us" 

         <TextView 
          android:id="@+id/contactUsTextView" 
          android:layout_width="0dp" 
          android:layout_height="wrap_content" 
          android:text="@string/contact_us"/> 

        </android.support.constraint.ConstraintLayout>  

       </android.support.constraint.ConstraintLayout> 
      </FrameLayout> 
     </ScrollView> 
    </android.support.constraint.ConstraintLayout>  
</layout> 

단편 SettingsFragment.java :

public class SettingsFragment extends Fragment { 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     SettingsBinding binding = DataBindingUtil.setContentView(getActivity(), R.layout.settings); 
     binding.setHandler(this); 
     return binding.getRoot(); 
    } 

    public void onClickContactUs(View view) { 
    } 
} 

하지만 오류 얻을 : 당신이 일반적으로 된 setContentView로 할 것 같은 방법은 (활동의 콘텐츠 뷰를 설정합니다 때문에 활동에 바인딩

FATAL EXCEPTION: main 
    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:3337) 
     at android.view.ViewGroup.addView(ViewGroup.java:3208) 
     at android.view.ViewGroup.addView(ViewGroup.java:3165) 
     at android.view.ViewGroup.addView(ViewGroup.java:3145) 
android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1425) 
android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1740) 
android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1809) 
android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:799) 
android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2580) 
android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2367) 
android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2322) 
android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2229) 
+0

'addview를)'내 코드에서. – Alex

답변

2

DataBindingUtil.setContentView()해야 사용() 메소드). 이 때문에 뷰 (binding.getRoot())가 이미 부모 뷰에 추가된다는 예외가 발생합니다. 당신의 조각 사용 DataBindingUtil.inflate에서

() 레이아웃을 부풀려 실제로보기 (조각 자체를 않는 이상) 추가없이 바인딩을 만들려면 (내가 방법을 사용하고 있지 않다

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    SettingsBinding binding = DataBindingUtil.inflate(inflater, R.layout.settings, container, false); 
    binding.setHandler(this); 
    return binding.getRoot(); 
} 
관련 문제