2017-12-16 7 views
2

Android Studio 3.1, Java 1.8Ausnahme, wenn die Datenbindung in Fragment mit: „Der angegebene Kind bereits ein Elternteil hat Sie müssen RemoveView() aufrufen, auf der Eltern Kind zuerst“

Ich versuche, Daten zu verwenden, Bindung:

Hier settings.xml Layout:

<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> 

Hier Fragment 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) { 
    } 
} 

Aber ich bekomme Fehler:

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

I Methode nicht 'addview verwenden bin () 'in meinem Code. – Alex

Antwort

2

DataBindingUtil.setContentView() Gebrauch sollte in einer Aktivität für die Bindung, da das Verfahren der Inhaltsansicht für die Aktivität festgelegt (wie Sie in der Regel mit dem setContentView tun würden() Methode). Aus diesem Grund erhalten Sie die Ausnahme, dass die Ansicht (binding.getRoot()) bereits an eine übergeordnete Ansicht angehängt ist.

In Ihrem Fragment Verwendung DataBindingUtil.inflate() ohne tatsächlich Anhängen der Ansicht, die das Layout und erstellen Sie die Bindung an aufblasen (was das Fragment tut sich später):

@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(); 
} 
Verwandte Themen